2009-04-08 25 views
5

私はFlexアプリケーションから実行時にアクティブなサーバのアドレス、ポート、コンテキストを取得する方法が必要です。ビルドプロセスにはantを使用しているので、サーバー接続情報はビルドプロパティファイルで動的に指定され、{server.name}、{server.port}および{context.root}プレースホルダはservices-config .xmlファイルではなく、実際の値。実行中のフレックスアプリケーションでサーバーエンドポイントを取得するにはどうすればよいですか?

私たちはblazeDSサーバーと同じマシン上で実行されているいくつかのJavaサーブレットを持っています。サーブレットURLをXMLファイルにハードコードする必要がないように、プログラムでサーバーエンドポイント情報を判別する方法がありますこれは私たちが現在行っていることです)。

私は、少なくとも私たちのメインのアプリケーションMXMLファイルに以下を追加することにより、コンテキストルートを得ることができることを見出した

:しかし、私はまだサーバーのアドレスとポートを取得するいくつかの方法が必要です

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

、および-context-root = http://myserver.com:8080/mycontextを指定してアドレス全体を指定すると、flexアプリケーションはhttp://localhost/http://myserver.com:8080/mycontext/messagebroker/amfに接続しようとしますが、これはもちろん間違いです。コンテキストルートとサーバーのURLを指定する適切な方法は何ですか?アプリケーションからそれらを取得するにはどうすればよいですか。

+0

Javaサーブレットを使用しているのですか、単にhttpserviceを使用していますか?あなたの質問に正確に従っているか、正確に何をしているかはわかりませんが、リモートオブジェクトでは、services-config.xmlファイルを使用するか、コンパイラオプションに入れる必要はありません。あなたは精緻化できますか? –

+0

我々は両方を使用しています。私たちにはHTTPエンドポイントがあり、いくつかの追加タスクのために別々のJavaサーブレットがあります。私たちはリモートオブジェクトを使用していません。すべてのメッセージの処理はCairngormによって行われます。 –

答えて

3

も参照私たちは、次の方法を提供するアプリケーションのサブクラスを使用します。

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

この一般的なアプリケーションはchannelEndPointContextchannelEndPointPathInfolocalServerRootURIプロパティ(一般的に "あるMyContext" をサポートし、あなたの例では、 "/ messagebroker/amf /"、アプリケーションがFlex Builderを介して実行されたときに使用されるローカルサーバールート。その場合はfile:// URL)。
その後、localServerRootURIプロパティを使用して、またはurlというアプリケーションを使用して完全なエンドポイントURIを決定します。このサービスは、アプリケーションのSWFを提供するサーバーと同じサーバーによって公開されます(これは、 。

だから、あなたの例では、次のように記述します。

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

をここから始めて、1はまた、自動的にアプリケーションのURLからchannelEndPointContextを決定する代わりに、この例のように、それをハードコーディングすることができます。

1

なぜ、location.hostnameの値を返すためにExternalInterface経由でラッパーのjavascript関数を呼び出さないのですか?ラッパーで

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

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

のjavascript:

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

それは私が求めていることではありません。さらに、これをApplication.application.urlで簡単に取得し、文字列を解析することもできます。 –

2

私はFlashVarsを使用して成功の前にURLを渡しました。フレックスで

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

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

そして:あなたのテンプレートのHTMLで

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

良いところは、あなたが本当にあなたがサーバーからこの道を好きに渡すことができます。

1

これらの作業をすべて行う必要はありません。 Flexフレームワーク自体が提供するURLUtilを使用してください)

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(); 
関連する問題