是否需要在WCF的服务器端处理CommunicationExceptions?

时间:2009-06-05 17:50:17

标签: c# wcf

是否需要在服务实现中处理CommunicationExceptions和/或TimeoutExceptions? (除了客户?)。当客户超时时会发生什么?服务是否继续处理消息,或者是否抛出异常?

由于

-Vic

例如,我需要做以下事情吗?

public MyServiceImpl:IMyService
{

 void DoSomething()
  {
  try{
   //Do something
  }
  catch (Communication exception){}
  catch (Timeout exception){}
  }
 }
}

2 个答案:

答案 0 :(得分:1)

由于您没有处于回调场景,因此如果超时(甚至在您的方法之前获取消息的各个调度程序将捕获),则甚至不会调用您的服务方法。因此,无需在此处捕获这些异常。

如果您使用Stream作为操作的参数之一,那么情况会有所不同,因为如果您的客户端发出异议,您可能会在读取流时遇到异常。但在这种情况下,无论如何你都必须防范例外。

答案 1 :(得分:0)

按照惯例:它取决于: - )

如果您有每次调用实例或单向消息,那么即使服务器上发生了坏事(异常),它们也会传播到客户端(或者在单向场景中: ),你不必担心它们。

但是:如果你有一个会话场景,你的传输协议(在netTtcp绑定的情况下是TCP / IP)使用传输会话,或者你的传输会话。 wsHttpBinding与服务器建立一个应用程序会话,然后你需要在服务器上绝对确保捕获所有异常并处理它们并仅将它们作为SOAP错误返回。

如果不这样做,则通道(客户端代理实例与服务器实例之间的通信管道)将“出现故障”,例如不可用,并且需要重新创建客户端代理实例。

另外,请记住.NET异常就是这样 - 特定于.NET的东西。如果您的服务需要互操作并且可以从例如Java,Ruby,PHP或其他客户端,您绝对必须捕获服务器端的所有.NET异常并将它们转换为SOAP错误(这是可互操作的等价物)。您可以通过在服务器端实现IErrorHandler接口来实现此目的。

马克