从silverlight调用Java Web服务会抛出一个异常
本文关键字:异常 一个 调用 silverlight Java Web 服务 | 更新日期: 2023-09-27 17:49:46
在我之前的问题之后,我找到了解决方案(好吧,部分解决方案)。
下面是Java部分的代码:@WebService
公共类MyWebService{
@WebMethodmyMethod(){
返回"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.f eresult抛出一个异常。我遗漏了什么/我该如何解决它?
注意,这段代码在c#控制台应用程序中完美运行(当它不是异步的时候)。但是当我运行异步代码时,它不起作用。
我猜当你试图从Silverlight访问Java Webservice时,你会得到一个System.ServiceModel.CommunicationException。
你的代码基本上没有什么问题,它也应该与c# Console App中的异步调用一起工作。
主要的问题是Silverlight(作为一个浏览器插件)强制执行了一些安全限制,这些限制阻止了Silverlight应用程序在没有进一步配置的情况下与加载服务器(由服务器名称和端口定义)以外的另一个服务器进行通信。这种行为可以按照下面的描述进行配置(也可以搜索"silverlight跨域调用"或"silverlight跨域策略")。
此限制(通常)不适用于桌面或控制台应用程序,因此它们可以很好地使用相同的web服务。
为了使你的代码工作,你需要在相同的"项目"/网站中托管Silverlight应用程序,而不是你的web服务(所以我想,自托管的web服务将不起作用,你需要切换到Java web项目,其中web服务将被托管)。由于Silverlight应用程序基本上由一个封闭的HTML文件和引用的二进制文件组成,因此您可以将其托管在任何服务器上,例如Apache Tomcat。