从silverlight调用Java Web服务会引发异常

时间:2011-04-09 09:07:00

标签: c# java .net silverlight

在我之前的问题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应用程序中完美运行(当它不是异步时)。但是当我运行异步代码时,它不起作用。

提前致谢。

1 个答案:

答案 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。

希望这有帮助。