I need a way of getting the active server address, port, and context during runtime from my flex application. Since we are using ant for our build process, the server connection information is dynamically specified in our build properties file, and the {server.name}, {server.port} and {context.root} placeholders are used in the services-config.xml file instead the actual values.
We have some other Java servlets running on the same machine as our blazeDS server, and I'd like some way to programmatically determine the server endpoint information so I don't need to hardcode the servlet URL's into an XML file (which is what we are presently doing).
I have found that I can at least get the context root by adding the following to our main application MXML file:
<mx:Application ... >
<mx:HTTPService id="contextRoot" rootURL="@ContextRoot()"/>
</mx:Application>
However, I still need some way of fetching the server address and port, and if I specify the entire address by giving -context-root=http://myserver.com:8080/mycontext, then the flex application attempts to connect to http://localhost/http://myserver.com:8080/mycontext/messagebroker/amf, which is of course totally wrong. What is the proper way to specify the context root and server URL, and how can I retrieve them from our application?
Best Answer
We use an Application subclass that offers the following methods :
This generic application supports the
channelEndPointContext
,channelEndPointPathInfo
andlocalServerRootURI
properties (typically "mycontext" and "/messagebroker/amf/" in your example, the local server root being used when the application is executed via Flex Builder, in such cases it has afile://
URL).The determination of the complete endpoint URI is then performed using either the
localServerRootURI
property or using the applicationurl
as our services are exposed by the very same server that serves the application's SWF (which is, as far as I understand your case too).So, in your example, one would write :
Starting from here, one can also automatically determine the
channelEndPointContext
from the application URL instead of hardcoding it as shown in this example.