从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 Web服务会抛出一个异常

我猜当你试图从Silverlight访问Java Webservice时,你会得到一个System.ServiceModel.CommunicationException。

你的代码基本上没有什么问题,它也应该与c# Console App中的异步调用一起工作。

主要的问题是Silverlight(作为一个浏览器插件)强制执行了一些安全限制,这些限制阻止了Silverlight应用程序在没有进一步配置的情况下与加载服务器(由服务器名称和端口定义)以外的另一个服务器进行通信。这种行为可以按照下面的描述进行配置(也可以搜索"silverlight跨域调用"或"silverlight跨域策略")。

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

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