2011-04-09 52 views
0

在我之前的問題HERE之後,我找到了解決方案(以及它的一部分)。從silverlight調用Java Web服務拋出異常

下面是Java的部分代碼:

@WebService 

公共類爲MyWebService {
@WebMethod 公共字符串myMethod的(){
回報的 「Hello World」; }

@WebMethod 
public int Add(@WebParam(name="a") int a, 
       @WebParam(name="b") int b) 
{ 
    return a + b; 
} 


public static void main(String[] args) 
{  
    String address = "http://127.0.0.1:8023/_WebServiceDemo"; 
    Endpoint.publish(address, new MyWebService()); 
    System.out.println("Listening: " + address); 
} 

}

,這裏是Silverlight的部分:

private void SearchResultList_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     MyWebServiceClient proxy = new MyWebServiceClient(); 
     proxy.AddCompleted += proxy_AddCompleted; 
     proxy.AddAsync(2, 3); 
    } 

    void proxy_AddCompleted(object sender, AddCompletedEventArgs e) 
    { 
     txtSearch.Text = e.Result.ToString(); 
    } 

但是當我運行此,e.Result拋出異常。 我在想什麼/我該如何解決?

請注意,此代碼在C#控制檯應用程序(當它不是異步時)完美運行。但是當我運行異步代碼時,它不起作用。

在此先感謝。

回答

1

我想你在嘗試從Silverlight訪問Java Webservice時遇到System.ServiceModel.CommunicationException。

您的代碼沒有什麼基本錯誤,它也應該在C#Console App中使用異步調用。

主要問題是Silverlight(作爲瀏覽器插件)強制執行一些安全限制,以防止Silverlight應用程序與另一個服務器進行通信,而不是進一步配置從加載(由服務器名稱和端口定義)的服務器。此行爲可以按照here(也可搜索「silverlight跨域調用」或「silverlight跨域策略」)進行配置。

此限制(通常)不適用於桌面或控制檯應用程序,因此它們可以在相同的Web服務中正常工作。

爲使您的代碼正常工作,您需要在與您的web服務相同的「項目」/網站內託管Silverlight應用程序(所以我想,自託管Web服務將無法工作,並且您需要切換到Java Web項目Web服務將被託管在哪裏)。由於Silverlight應用程序基本上由一個封閉的HTML文件和引用的二進制文件組成,因此您可以將其託管在任何服務器上,例如, Apache Tomcat。

希望這會有所幫助。

+0

你是完全正確的。除了我發現ExceptionException來自您提到的CommunicationException之外,經過一些調查。我發現我必須創建一個clientaccesspolicy.xml文件並將其放入應用程序的根文件夾中。我將它複製到任何我想到的地方,但仍然沒有機會! – 2011-04-09 14:31:34

+0

策略文件必須放置在呼叫目標處,您的情況是Web服務託管站點。正如後續發佈中提到的,這似乎不適用於自託管Web服務。 – jCoder 2011-04-09 20:14:46

+0

我讀過一些可能的地方。我想我應該把它放在Java服務器的根文件夾(我不知道它在哪裏,因爲它不是IIS和Apache,我不知道Eclipse使用哪個服務器) - 更多內容在其他文章 – 2011-04-09 20:38:57