2009-04-08 13 views
5

Potrzebuję sposobu na uzyskanie aktywnego adresu serwera, portu i kontekstu podczas uruchamiania z mojej aplikacji Flex. Ponieważ używamy mrówki dla naszego procesu budowania, informacje o połączeniu serwera są dynamicznie określane w naszym pliku właściwości kompilacji, a symbole zastępcze {server.name}, {server.port} i {context.root} są używane w services-config .xml zamiast rzeczywistych wartości.Jak uzyskać punkt końcowy serwera w uruchomionej aplikacji Flex?

Mamy kilka innych serwletów Javy działających na tym samym komputerze, co nasz serwer blazeDS, i chciałbym w jakiś sposób programowo określić informacje o punktach końcowych serwera, więc nie będę musiał kodować adresu URL serwletu w pliku XML (właśnie to robimy).

Odkryłem, że mogę przynajmniej dostać korzeń kontekstowego poprzez dodanie następujących do naszego głównego pliku MXML aplikacji:

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

Jednak nadal muszę jakiś sposób pobierania adresu serwera i port, a jeśli podam cały adres przez podanie -context-root = http://myserver.com:8080/mycontext, wówczas aplikacja elastyczna spróbuje połączyć się z http://localhost/http://myserver.com:8080/mycontext/messagebroker/amf, co jest oczywiście całkowicie błędne. Jaki jest właściwy sposób określenia kontekstowego katalogu głównego i adresu URL serwera oraz w jaki sposób mogę je pobrać z naszej aplikacji?

+0

Czy używasz serwletów Java lub tylko usługi http? Nie jestem pewien, czy dokładnie podążam za twoim pytaniem, czy też dokładnie to, co robisz, ale przy zdalnym obiekcie, możesz zrobić to wszystko w kodzie, zamiast używać pliku services-config.xml lub umieścić go w opcjach kompilatora. Czy możesz rozwinąć? –

+0

Korzystamy z obu. Mamy punkt końcowy HTTP i oddzielne serwlety Java dla niektórych dodatkowych zadań. Nie * używamy * zdalnych obiektów; cała obsługa wiadomości odbywa się przez Cairngorm. –

Odpowiedz

3

Używamy podklasy aplikacja, która oferuje następujące metody:

/** 
    * 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 
} 

Ta ogólna Aplikacja wspomaga channelEndPointContext, channelEndPointPathInfo i localServerRootURI właściwości (typowo "mycontext" i "/ messagebroker/amf /" w twoim przykładzie, lokalny serwer główny, który jest używany, gdy aplikacja jest uruchamiana za pomocą narzędzia Flex Builder, w takich przypadkach ma numer file:// URL).
Określenie pełnego identyfikatora URI punktu końcowego jest następnie wykonywane przy użyciu właściwości localServerRootURI lub przy użyciu aplikacji url, ponieważ nasze usługi są ujawniane przez ten sam serwer, który obsługuje plik SWF aplikacji (co jest, o ile rozumiem, również Twój przypadek). .

Tak w przykładzie, można by napisać:

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

Począwszy od tego miejsca, można również automatycznie określić channelEndPointContext z adresu URL aplikacji zamiast hardcoding go, jak pokazano w poniższym przykładzie.

1

Dlaczego nie wywołać funkcji javascript w opakowaniu za pomocą ExternalInterface, aby zwrócić wartość location.hostname?

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

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

JavaScript w opakowaniu jednostkowym:

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

Nie o to pytam. Dodatkowo możesz to zrobić równie łatwo dzięki Application.application.url i analizowaniu łańcucha. –

2

Używam FlashVars do przekazywania adresów URL z wcześniejszym sukcesem.W szablonie HTML:

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

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

a następnie w Flex

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

Dobrą rzeczą jest to naprawdę można przejść w co chcesz z serwera w ten sposób.

1

Nie trzeba wykonywać wszystkich tych ciężkich prac. Po prostu użyj URLUtil dostarczonego przez samą frameworię Flex;)

2
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(); 
Powiązane problemy