Silverlight和WCF:处理'WCF down'异常/ WCF连接检查

时间:2010-03-07 09:31:46

标签: wcf silverlight

在我的Silverlight应用程序中,我使用Visual Studio为我生成的客户端(添加服务引用...)异步调用Web服务。
我的代码如下所示:

ServiceClient serviceClient = new ServiceClient();
serviceClient.GetServerTimeCompleted += new EventHandler<GetServerTimeCompletedEventArgs>(serviceClient_GetServerTimeCompleted);
serviceClient.GetServerTimeAsync();

void serviceClient_GetServerTimeCompleted(object sender, GetServerTimeCompletedEventArgs e)
{
         // do nothing atm
}

只要服务启动并运行,一切正常,但是当服务没有运行时,我得到:

private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
  

“期间发生了异常   操作,使结果无效。   检查InnerException是否有异常   方式“。

的InnerException

  

“尝试时发生错误   向URI发出请求   的 'http://'。这可能是   由于试图访问服务   没有适当的跨域方式   跨域政策到位,或者   不适合SOAP的策略   服务。您可能需要联系   发布服务的所有者   跨域策略文件并确保   它允许与SOAP相关的HTTP头   被发送。也可能导致此错误   通过在Web中使用内部类型   服务代理不使用   InternalsVisibleToAttribute属性。   请查看内部异常   更多细节。“

在这种情况下我得到异常是有道理的,但我无法弄清楚的是如何在我的客户端代码中捕获异常。有没有标准的方法来做到这一点?如果我理解这是如何工作的,当我的代码调用生成的代码时,它会产生另一个实际调用Web服务并等待响应的线程。例外是在该线程和生成的代码中。我的调用代码(见上文)或我的回调方法都没有机会看到异常。

由于

基督教

3 个答案:

答案 0 :(得分:1)

有许多理由不在Visual Studio中使用“添加服务引用”功能。这是一篇关于这些问题的好(又长)文章,how to use WCF creating your clients。我现在正在解决这些问题。

关于“添加服务引用”的问题包括可下载客户端.XAP文件中的代码膨胀,难以维护生成的代码,当服务器地址和端口在客户端配置文件中进行硬编码时难以登台或发送代码(也嵌入在.XAP中),还有更多。构建自己的客户端还将为您提供更好的管理客户端代码异常的功能。

有一些权衡;您需要使您的数据协定类可移植到Silverlight环境。 (你不能只是添加对服务器端.NET程序集的引用;它不起作用。)上面链接的同一个站点在re-using assemblies in Silverlight上有一篇很好的文章,但可能是解决这个问题的最简单方法是从Silverlight项目添加到服务器端类的链接。 (在Silverlight项目中,右键单击并添加 - >>添加现有项目...并找到要包含的项目,但不要单击“添加”按钮,而是单击其旁边的向下箭头并单击“添加”作为链接“。)注意其他引用和使用引用服务器端类的语句;您可能需要进行条件编译,以便您的数据协定类在客户端项目中干净地编译。

总的来说,它看起来更像是一种更干净的方式,特别是对于可能使用大量服务合同和数据合同的大型项目,或者您需要将Silverlight项目作为运行在其他人的商业应用程序的一部分运送的地方服务器。对于可测试性而言,它也应该更加清晰,特别是对于集成和分级测试。

答案 1 :(得分:0)

之前我遇到过这个问题 - 您需要在 ServiceClient 设置代码周围添加异常处理代码。我通常检查以下 CommunicationException TimeoutException EndpointNotFoundException ,并为用户提供适当的对话框,告诉他们某些内容已损坏:

ServiceClient serviceClient;
try
{
   serviceClient = new ServiceClient(); 
   serviceClient.GetServerTimeCompleted += new EventHandler<GetServerTimeCompletedEventArgs>(serviceClient_GetServerTimeCompleted); 
   serviceClient.GetServerTimeAsync();
}
catch (EndpointNotFoundException ex)
{
   // log exception
   // show error dialog
}

注意:这不会处理在asnchronous方法回调期间遇到的错误 - 它将需要它自己的(类似的)异常处理。

答案 2 :(得分:0)

实际上,您必须将crossdomainaccesspolicy.xml放在IIS默认网站根文件夹中。 您复制下面给出的xml内容并保存在ClinetAccespolicy.xml的名称中,然后放在IIS默认网站根文件夹中。