在我之前的问题HERE之后,我找到了解决方案(好吧,部分问题)。
这是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抛出异常。 我缺少什么/我该如何解决?
请注意,此代码在C#Console应用程序中完美运行(当它不是异步时)。但是当我运行异步代码时,它不起作用。
提前致谢。
答案 0 :(得分:1)
我猜你在尝试从Silverlight访问Java Web服务时会遇到System.ServiceModel.CommunicationException。
您的代码没有任何问题,它也应该与C#Console App中的异步调用一起使用。
主要问题是Silverlight(作为浏览器插件)强制执行某些安全限制,这些限制阻止Silverlight应用程序与另一个服务器(由服务器名称和端口定义)进行通信,而无需进一步配置。可以按照here所述配置此行为(还搜索“silverlight跨域调用”或“silverlight跨域策略”)。
此限制(通常)不适用于桌面或控制台应用程序,因此它们可以使用相同的Web服务正常工作。
要使代码正常工作,您需要在与Web服务相同的“项目”/网站内托管Silverlight应用程序(所以我想,自托管Web服务不起作用,您需要切换到Java Web项目,其中web服务将被托管)。由于Silverlight应用程序基本上由一个封闭的HTML文件和引用的二进制文件组成,因此您可以在任何服务器上托管它,例如Apache Tomcat。
希望这有帮助。