Как мне получить конечную точку сервера в работающем гибком приложении?

Мне нужен способ получения активного адреса сервера, порта и контекста во время выполнения из моего гибкого приложения. Поскольку мы используем ant для нашего процесса сборки, информация о подключении к серверу динамически указывается в нашем файле свойств сборки, а заполнители {server.name}, {server.port} и {context.root} используются в services-config. .xml вместо фактических значений.

У нас есть несколько других сервлетов Java, работающих на том же компьютере, что и наш сервер blazeDS, и я хотел бы каким-то образом программно определять информацию о конечной точке сервера, чтобы мне не нужно было жестко закодировать URL-адрес сервлета в файл XML (что мы в настоящее время делаем).

Я обнаружил, что могу, по крайней мере, получить корень контекста, добавив следующее в файл MXML нашего основного приложения:

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

Однако мне все еще нужен способ получить адрес и порт сервера, и если я укажу весь адрес, указав -context-root = http://myserver.com:8080/mycontext, затем гибкое приложение пытается подключиться к http://localhost/http://myserver.com:8080/mycontext/messagebroker/amf, что, конечно, совершенно неверно. Как правильно указать корень контекста и URL-адрес сервера и как их получить из нашего приложения?


person Nik Reiman    schedule 08.04.2009    source источник
comment
Так вы используете Java-сервлеты или просто httpservice? Я не уверен, что точно слежу за вашим вопросом или что именно вы делаете, но с удаленным объектом вы также можете сделать все это в коде, вместо того, чтобы использовать файл services-config.xml или помещать его в параметры компилятора. Вы можете уточнить?   -  person Ryan Guill    schedule 15.04.2009
comment
Мы используем оба. У нас есть конечная точка HTTP и отдельные сервлеты Java для некоторых дополнительных задач. Мы не используем удаленные объекты; вся обработка сообщений осуществляется через Cairngorm.   -  person Nik Reiman    schedule 15.04.2009


Ответы (5)


Мы используем подкласс 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 
 }

Это универсальное приложение поддерживает свойства channelEndPointContext, channelEndPointPathInfo и localServerRootURI (в вашем примере обычно "mycontext" и "/ messagebroker / amf /", при этом используется корень локального сервера, когда приложение выполняется через Flex Builder, в таких случаях он имеет file:// URL).
Затем определение полного URI конечной точки выполняется либо с помощью свойства localServerRootURI, либо с использованием приложения url, поскольку наши службы предоставляются тем же сервером, который обслуживает SWF приложения (что, насколько я понимаю в вашем случае слишком).

Итак, в вашем примере можно написать:

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

Начиная с этого момента, можно также автоматически определять channelEndPointContext из URL-адреса приложения вместо его жесткого кодирования, как показано в этом примере.

person Guillaume G.    schedule 15.04.2009

Раньше я успешно использовал FlashVars для передачи URL-адресов. В вашем шаблоне html:

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

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

А затем во флексе:

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

Приятно то, что таким образом вы действительно можете передать с сервера все, что захотите.

person rogueg    schedule 17.04.2009

Почему бы не вызвать функцию javascript в оболочке через ExternalInterface, чтобы вернуть значение 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>
person Eric Belair    schedule 08.04.2009
comment
Я не об этом спрашиваю. Кроме того, вы можете легко получить это через Application.application.url и проанализировав строку. - person Nik Reiman; 11.04.2009

Вы можете использовать BrowserManager для получения информации об URL-адресе.

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

person smartdirt    schedule 13.04.2009

Нет необходимости выполнять всю эту тяжелую работу. Просто используйте URLUtil, предоставляемый самим фреймворком Flex;)

person Sahan    schedule 01.11.2010