2009-04-08 28 views
5

Tôi cần một cách để nhận địa chỉ máy chủ, cổng và ngữ cảnh hoạt động trong thời gian chạy từ ứng dụng flex của tôi. Vì chúng tôi đang sử dụng kiến ​​cho quá trình xây dựng của chúng tôi, thông tin kết nối máy chủ được chỉ định động trong tệp thuộc tính xây dựng của chúng tôi và trình giữ chỗ {server.name}, {server.port} và {context.root} được sử dụng trong cấu hình dịch vụ .xml tệp thay vì giá trị thực.Làm thế nào để có được điểm cuối máy chủ trong một ứng dụng flex đang chạy?

Chúng tôi có một số servlet Java khác chạy trên cùng một máy như máy chủ blazeDS của chúng tôi và tôi muốn một số cách để xác định thông tin điểm cuối của máy chủ theo chương trình để không cần phải mã hóa URL servlet vào một tệp XML (đó là những gì chúng tôi hiện đang làm).

Tôi đã thấy rằng tôi ít nhất có thể lấy rễ bối cảnh bằng cách thêm dòng sau vào chính hồ sơ MXML của chúng tôi:

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

Tuy nhiên, tôi vẫn cần một số cách để lấy địa chỉ máy chủ và cổng, và nếu tôi chỉ định toàn bộ địa chỉ bằng cách cho -context-root = http://myserver.com:8080/mycontext, thì ứng dụng flex sẽ cố kết nối với http://localhost/http://myserver.com:8080/mycontext/messagebroker/amf, điều này tất nhiên là hoàn toàn sai. Cách thích hợp để xác định URL gốc và URL máy chủ là gì và làm thế nào tôi có thể truy xuất chúng từ ứng dụng của chúng tôi?

+0

Vì vậy, bạn đang sử dụng các servlet java hay chỉ httpservice? Im không chắc chắn tôi đang theo dõi câu hỏi của bạn một cách chính xác hoặc những gì bạn đang làm chính xác, nhưng với đối tượng từ xa, bạn cũng có thể làm tất cả điều đó trong mã thay vì phải sử dụng tệp services-config.xml hoặc đặt nó trong một tùy chọn trình biên dịch. Bạn có thể xây dựng? –

+0

Chúng tôi đang sử dụng cả hai. Chúng ta có một điểm cuối HTTP và các servlet Java riêng biệt cho một số nhiệm vụ bổ sung. Chúng tôi không * sử dụng các đối tượng từ xa; tất cả xử lý tin nhắn được thực hiện thông qua Cairngorm. –

Trả lời

3

Chúng tôi sử dụng một lớp ứng dụng cung cấp các phương pháp sau:

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

ứng dụng generic này hỗ trợ các channelEndPointContext, channelEndPointPathInfolocalServerRootURI tài sản (thường "mycontext" và "/ messagebroker/amf /" trong ví dụ của bạn, gốc máy chủ cục bộ đang được sử dụng khi ứng dụng được thực hiện thông qua Flex Builder, trong trường hợp này nó có một file:// URL). Sau đó, việc xác định URI điểm cuối hoàn thành được thực hiện bằng cách sử dụng thuộc tính localServerRootURI hoặc sử dụng ứng dụng url vì các dịch vụ của chúng tôi được hiển thị bởi cùng một máy chủ phục vụ SWF của ứng dụng (tức là, theo tôi hiểu trường hợp của bạn) .

Vì vậy, trong ví dụ của bạn, người ta sẽ viết:

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

Bắt đầu từ đây, người ta cũng có thể tự động xác định channelEndPointContext từ URL ứng dụng thay vì hardcoding nó như trong ví dụ này.

1

Tại sao không gọi hàm javascript trong trình bao bọc qua ExternalInterface để trả về giá trị của location.hostname?

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

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

javascript trong wrapper:

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

Đó không phải là những gì tôi yêu cầu. Thêm vào đó, bạn có thể nhận được điều này dễ dàng thông qua Application.application.url và phân tích cú pháp chuỗi. –

2

Tôi đã sử dụng FlashVars để chuyển url trước đó thành công.Trong mẫu của bạn html:

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

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

Và rồi trong flex:

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

Những điều tốt đẹp là bạn thực sự có thể vượt qua trong bất cứ điều gì bạn thích từ máy chủ theo cách này.

1

Không cần phải làm tất cả những công việc khó khăn này. Chỉ cần sử dụng URLUtil do chính Flex framework cung cấp;)

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(); 
Các vấn đề liên quan