如何在正在运行的Flex应用程序中获取服务器端点?

时间:2009-04-08 15:20:05

标签: flex endpoints

我需要一种在运行时从flex应用程序获取活动服务器地址,端口和上下文的方法。由于我们在构建过程中使用ant,因此在构建属性文件中动态指定服务器连接信息,并在services-config中使用{server.name},{server.port}和{context.root}占位符。 .xml文件而不是实际值。

我们有一些其他Java servlet在与我们的blazeDS服务器相同的机器上运行,我想要以某种方式以编程方式确定服务器端点信息,因此我不需要将servlet URL硬编码到XML文件中(是我们目前正在做的事情。)

我发现通过将以下内容添加到主应用程序MXML文件中,我至少可以获取上下文根目录:

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

但是,我仍然需要一些获取服务器地址和端口的方法,如果我通过给出-context-root = http://myserver.com:8080/mycontext来指定整个地址,那么flex应用程序会尝试连接到{{3} },这当然是完全错误的。指定上下文根和服务器URL的正确方法是什么,以及如何从应用程序中检索它们?

6 个答案:

答案 0 :(得分:3)

我们使用Application子类,它提供以下方法:

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

从这里开始,还可以从应用程序URL自动确定channelEndPointContext,而不是硬编码,如本例所示。

答案 1 :(得分:2)

我已经使用FlashVars成功传递了网址。在你的模板html中:

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

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

然后在flex:

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

好消息是你可以通过这种方式从服务器传递任何你想要的东西。

答案 2 :(得分: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();

答案 3 :(得分:1)

为什么不通过ExternalInterface在包装器中调用javascript函数来返回location.hostname的值?

<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>

答案 4 :(得分:1)

您可以使用BrowserManager获取有关网址的信息。

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

另见 http://livedocs.adobe.com/flex/3/html/deep_linking_7.html#251252

答案 5 :(得分:1)

无需做所有这些艰苦的工作。 只需使用Flex框架本身提供的URLUtil;)