2009-04-08 6 views
5

Necesito una forma de obtener la dirección del servidor activo, el puerto y el contexto durante el tiempo de ejecución de mi aplicación flexible. Dado que estamos usando ant para nuestro proceso de compilación, la información de conexión del servidor se especifica dinámicamente en nuestro archivo de propiedades de compilación, y los marcadores de posición {server.name}, {server.port} y {context.root} se usan en los servicios-config archivo .xml en lugar de los valores reales.¿Cómo obtengo el punto final del servidor en una aplicación en ejecución?

Tenemos algunos otros servlets de Java ejecutándose en la misma máquina que nuestro servidor blazeDS, y me gustaría alguna forma de determinar programáticamente la información del punto final del servidor para no tener que codificar las URL del servlet en un archivo XML (que es lo que estamos haciendo actualmente).

he encontrado que al menos puedo conseguir la raíz de contexto añadiendo lo siguiente a nuestro principal archivo de la aplicación MXML:

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

Sin embargo, todavía necesita alguna manera de ir a buscar la dirección del servidor y el puerto, y si especifico la dirección completa dando -context-root = http://myserver.com:8080/mycontext, entonces la aplicación flex intenta conectarse a http://localhost/http://myserver.com:8080/mycontext/messagebroker/amf, lo cual es totalmente erróneo. ¿Cuál es la forma correcta de especificar la raíz de contexto y la URL del servidor, y cómo puedo recuperarlos desde nuestra aplicación?

+0

Así está usando servlets Java o simplemente HTTPService? No estoy seguro de estar siguiendo su pregunta exactamente o de lo que está haciendo exactamente, pero con el objeto remoto, también puede hacer todo eso en código en lugar de tener que usar el archivo services-config.xml o ponerlo en las opciones del compilador. ¿Puedes elaborar? –

+0

Estamos usando ambos. Tenemos un punto final HTTP y servlets de Java separados para algunas tareas adicionales. Estamos * no * usando objetos remotos; todo el manejo de mensajes se realiza a través de Cairngorm. –

Respuesta

3

Utilizamos una subclase de aplicación que ofrece los siguientes métodos:

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

Esta aplicación genérica apoya la channelEndPointContext, channelEndPointPathInfo y localServerRootURI propiedades (por lo general "myContext" y "/ messagebroker/amf /" en su ejemplo, la raíz del servidor local que se utiliza cuando la aplicación se ejecuta a través de Flex Builder, en tales casos tiene un file:// URL).
La determinación del URI de punto final completo se realiza usando la propiedad localServerRootURI o usando la aplicación url ya que nuestros servicios están expuestos por el mismo servidor que sirve el SWF de la aplicación (que es, por lo que entiendo su caso también) .

Así, en su ejemplo, uno escribiría:

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

A partir de aquí, también se puede determinar automáticamente el channelEndPointContext de la URL de la aplicación en lugar de codificar como se muestra en este ejemplo.

1

¿Por qué no llamar a una función javascript en el contenedor a través de ExternalInterface para devolver el valor de location.hostname?

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

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

Javascript en envoltorio:

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

Eso no es lo que estoy preguntando. Además, puede obtener esto con la misma facilidad a través de Application.application.url y analizar la cadena. –

2

He usado FlashVars para pasar urls en antes con éxito.En su plantilla html:

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

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

Y luego, en la flexión:

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

Lo bueno es que realmente puede pasar en lo que quiera desde el servidor de esta manera.

1

No hay necesidad de hacer todo este trabajo duro. Sólo tiene que utilizar URLUtil proporcionada por sí mismo marco de trabajo 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(); 
Cuestiones relacionadas