Home
News
Weblog
Kompetenzen
Referenzen
Media
Unternehmen
Kontakt

Archive for the ‘Adobe Flex’ tag

HTTPStatus beim dynamischen Laden eines Images abfragen

without comments

Wenn man in einer Flex-Anwendung ein Image dynamisch nachladen möchte, ist man evtl., je nach Kontext, darauf angewiesen, den Erfolg des Nachladens sicherzustellen. Das kann z.B. dann der Fall sein, wenn das Ausführen von weiteren Programmschritten davon anbhängt. Ein Ansatzpunkt ist das Abfragen des HTTPStatus.

Über einen Listener, der an die entsprechende Image-Komponente attached wird, lässt sich das HTTPStatusEvent überwachen. Über das Property status kann dann der Erfolg des Nachladens überprüft werden.
Einen Haken hat diese Methode allerdings: Der Flash Player erzeugt in den Browsern Netscape, Mozilla, Safari, Opera und IE (Mac) immer den Code 0. Das ist natürlich wenig hilfreich. Mann kann das HTTPStatusEvent jedoch dennoch nutzen, da zu jedem HTTPStatus der Listener anspricht. Fragt man also im Listener noch die bisher geladenen Bytes im Verhältnis zu allen Bytes (Dateigröße des Images) ab, kann man den Erfolg des Nachladens sicherstellen.

Der Actionscript-Code für das Anhängen eines Listener (an einer Image-Komponente):

...
private var loadedImage:Image = new Image();
loadedImage.addEventListener(HTTPStatusEvent.HTTP_STATUS, handleImgLoadedHTTPStatus);
loadedImage.source = "http://dynamicsource.something";
...

Der entsprechende Code für die Handler-Funktion:

private function handleImgLoadedHTTPStatus(evt:HTTPStatusEvent):void {
    switch (evt.status) {
        case 0:
            if(loadedImage != null && loadedImage.bytesLoaded == loadedImage.bytesTotal) {
	            // do something very important here...
            }
            break;
        case 404:
            // if status is send, Code 404 simply means: image has not been found!
            break;
    }
}

Inspiriert durch den Weblog von Peter deHaan.

Written by Carsten Schütz

Oktober 27th, 2008 at 5:24 pm

Security Error beim Aufruf eines Webservices

without comments

Seit dem Release der aktuellen Flash Player Version 9.0.124.0 von Adobe kann es beim Aufruf eines Webservices aus einer Flex-Anwendung heraus zu einer Verletzung der Sicherheitsrestriktionen des Flash Players kommen. Während der Aufruf in der Version 9.0.115.0 noch fehlerlos funktionierte, erhält man nun den folgenden Fehlercode im FaultEvent:

[FaultEvent fault=[RPC Fault faultString="Security error accessing url" ... ]]

Der Grund für den Fehler liegt in der unzureichenden Zugriffsdeklaration innerhalb der crossdomain.xml auf dem Server, der den Webservice anbietet. Das Problem wurde in etlichen Foren bereits diskutiert, der erste Lösungsansatz sah das Hinzufügen der folgenden Richtlinie in der crossdomain.xml vor:

<allow-http-request-headers-from domain="*" />

Dieser Zusatz alleine reicht allerdings nicht aus. Um den Zugriff auf einen SOAP-Webservice aus der Flex-Anwendung heraus wieder zu ermöglichen, ist es erforderlich,das headers -Attributs zu setzen. Die korrekte Richtlinie sieht innerhalb der crossdomain.xml dann wie folgt aus:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
	<allow-access-from domain="*" />
	<allow-http-request-headers-from domain="*" headers="SOAPAction" />
</cross-domain-policy>

Unbedingt zu beachten ist, dass durch das Setzen des domain -Attributes auf die Wildcard “*” natürlich der Zugriff sämtlicher Domains erlaubt wird. Soll der Zugriff eingeschränkt werden, muss das Attribut auf die Domain des Servers, der die Flex-Anwendung hostet, gesetzt werden.

Written by Carsten Schütz

Oktober 14th, 2008 at 4:57 pm