5 Stimmen

Wie erhalte ich den Server-Endpunkt in einer laufenden Flex-Anwendung?

Ich brauche eine Möglichkeit, die aktive Serveradresse, den Port und den Kontext während der Laufzeit meiner Flex-Anwendung abzurufen. Da wir Ant für unseren Build-Prozess verwenden, werden die Serververbindungsinformationen dynamisch in unserer Build-Eigenschaftendatei angegeben, und die Platzhalter {server.name}, {server.port} und {context.Root} werden in der Datei services-config.xml anstelle der tatsächlichen Werte verwendet.

Wir haben einige andere Java-Servlets, die auf dem gleichen Rechner wie unser BlazeDS-Server laufen, und ich möchte eine Möglichkeit, die Server-Endpunkt-Informationen programmatisch zu bestimmen, so dass ich nicht die Servlet-URLs in eine XML-Datei hardcodieren muss (was wir derzeit tun).

Ich habe festgestellt, dass ich zumindest den Kontext Root durch Hinzufügen der folgenden zu unserer Hauptanwendung MXML-Datei erhalten kann:

<mx:Application ... >
  <mx:HTTPService id="contextRoot" rootURL="@ContextRoot()"/>
</mx:Application>

Ich benötige jedoch immer noch eine Möglichkeit, die Serveradresse und den Port abzurufen, und wenn ich die gesamte Adresse durch Angabe von -context-Root= http://myserver.com:8080/mycontext dann versucht die Flex-Anwendung, eine Verbindung zu http://localhost/http://myserver.com:8080/mycontext/messagebroker/amf was natürlich völlig falsch ist. Wie kann ich den Kontext Root und die Server-URL richtig angeben und wie kann ich sie aus unserer Anwendung abrufen?

0 Stimmen

Verwenden Sie also Java-Servlets oder nur httpservice? Ich bin mir nicht sicher, ob ich Ihrer Frage genau folgen kann oder was Sie genau tun, aber mit dem Remote-Objekt können Sie all das auch im Code tun, anstatt die services-config.xml-Datei zu verwenden oder sie in eine Compileroption zu setzen. Können Sie das näher erläutern?

0 Stimmen

Wir verwenden beides. Wir haben einen HTTP-Endpunkt und separate Java-Servlets für einige zusätzliche Aufgaben. Wir sind no mit entfernten Objekten; die gesamte Nachrichtenverarbeitung erfolgt über Cairngorm.

3voto

Guillaume G. Punkte 385

Wir verwenden eine Application-Unterklasse, die die folgenden Methoden bietet:

 /**
  * The URI of the AMF channel endpoint. <br/>
  * Default to #rootURI + #channelEndPointContext + #this.channelEndPointPathInfo
  */
 public function get channelEndPointURI() : String
 {
    return this.rootServerURI + ( this.channelEndPointContext ? this.channelEndPointContext : "" ) + this.channelEndPointPathInfo
 }

 /**
  * The root URI (that is scheme + hierarchical part) of the server the application
  * will connect to. <br/>
  * If the application is executing locally, this is the #localServerRootURI. <br/>
  * Else it is determined from the application #url. <br/>
  */ 
 public function get rootServerURI() : String
 {
      var result : String = ""
      if ( this.url && ( this.url.indexOf("file:/") == -1 ) )
      {
           var uri : URI = new URI( this.url )
           result = uri.scheme + "://" + uri.authority + ":" + uri.port
      }
      else
      {
           result = this.localServerRootURI
      }

      return result 
 }

Diese generische Anwendung unterstützt die channelEndPointContext , channelEndPointPathInfo y localServerRootURI Eigenschaften (typischerweise "mycontext" und "/messagebroker/amf/" in Ihrem Beispiel, der lokale Server Root, der verwendet wird, wenn die Anwendung über Flex Builder ausgeführt wird, in solchen Fällen hat sie eine file:// URL).
Die Bestimmung des vollständigen Endpunkt-URIs erfolgt dann entweder mit dem localServerRootURI Eigenschaft oder über die Anwendung url da unsere Dienste von demselben Server bereitgestellt werden, der die SWF-Datei der Anwendung bereitstellt (was in Ihrem Fall auch der Fall ist, soweit ich weiß).

In Ihrem Beispiel würde man also schreiben:

 <SuperApplication ...> <!-- SuperApplication is the enhanced Application subclass -->
    <mx:HTTPService id="myHTTPService" url="{this.channelEndPointURI}"/>
 </SuperApplication>

Von hier aus kann man auch automatisch die channelEndPointContext aus der Anwendungs-URL zu verwenden, anstatt sie wie in diesem Beispiel fest zu kodieren.

2voto

rogueg Punkte 293

Ich habe FlashVars verwendet, um Urls in vor mit Erfolg übergeben. In Ihrer Vorlage html:

var rootURL = location.href.substring(0,location.href.indexOf("flexBin"));    
...

AC_FL_RunContent(
    "src", "${swf}",
    "FlashVars", "rootURL="+rootURL,
    "width", "${width}",
...

Und dann in Flex:

service.rootURL = Application.application.parameters.rootURL;

Das Schöne daran ist, dass man auf diese Weise wirklich alles vom Server einspeisen kann, was man möchte.

2voto

Srinivasan Punkte 21
var url:String = (FlexGlobals.topLevelApplication as Application).url 
            //var fullURL:String = mx.utils.URLUtil.getFullURL(url, url);

            var serverName:String = mx.utils.URLUtil.getServerNameWithPort(url);
            listContents.url = mx.utils.URLUtil.getProtocol(url)+"://"+serverName+"/custom_message.html";
            //isSecure = mx.utils.URLUtil.isHttpsURL(url);   

            //pageURL = pageURL.substring(0, pageURL.indexOf("/"));
            listContents.send();

1voto

Eric Belair Punkte 10406

Warum nicht eine Javascript-Funktion im Wrapper über ExternalInterface aufrufen, um den Wert von location.hostname zurückzugeben?

<mx:Script>
    <![CDATA[
        private var hostname:String;

        private function getHostName():void
        {
            hostname = ExternalInterface.call(getHostName);
        }
    ]]>
</mx:Script>

javascript im Wrapper:

<script type="text/javascript">
    function getHostName()
    {
        return location.hostname;
    }
</script>

1voto

smartdirt Punkte 995

Sie können den BrowserManager verwenden, um die Informationen über die URL zu erhalten.

var bm:IBrowserManager = BrowserManager.getInstance();
bm.init(Application.application.url);
var url:String = bm.base;

siehe auch http://livedocs.adobe.com/flex/3/html/deep_linking_7.html#251252

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X