从silverlight调用Java Web服务会引发exception

在我之前的问题之后,我找到了解决方案(好吧,其中的一部分)。

这是Java部分的代码:

@WebService 

公共类MyWebService {
@WebMethod public String 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抛出exception。 我缺少什么/我该如何解决?

请注意,此代码在C#Console应用程序中完美运行(当它不是异步时)。 但是当我运行异步代码时,它不起作用。

提前致谢。

我猜你在尝试从Silverlight访问Java Webservice时遇到了System.ServiceModel.CommunicationException。

您的代码没有任何问题,它也应该与C#Console App中的异步调用一起使用。

主要问题是Silverlight(作为浏览器插件)强制执行一些安全限制,这些限制阻止Silverlight应用程序与另一个服务器(由服务器名称和端口定义)进行通信,而无需进一步配置。 可以按此处所述配置此行为(还搜索“silverlight跨域调用”或“silverlight跨域策略”)。

此限制(通常)不适用于桌面或控制台应用程序,因此它们可以使用相同的Web服务正常工作。

为了使你的代码工作,你需要在与你的webservice相同的“项目”/网站内托管Silverlight应用程序(所以我想,自托管web服务不起作用,你需要切换到web web项目,其中webservice是被托管)。 由于Silverlight应用程序基本上由一个封闭的HTML文件和引用的二进制文件组成,因此您可以将它托管在任何服务器上,例如Apache Tomcat。

希望这可以帮助。