【问题标题】:WCF - "CommunicationException was unhandled by user code"WCF - “CommunicationException 未被用户代码处理”
【发布时间】:2009-08-16 19:52:28
【问题描述】:

在使用 WCF 的系统中如何处理 CommunicationExceptions?我有一个客户端使用 SOAP 通过 WCF 与服务器通信 - 所有异步通信。有时我会收到一个 CommunicationException 抛出我的脸 - 没有看到任何关于为什么以及何时发生这种情况的可重现模式。

但是;我能够继续运行该程序,因为这只是第一次机会(?)异常。因此,我假设我不必担心这一点,并且它是在幕后处理的?但是我仍然很担心,如果有人能就此启发我,那就太好了。我应该在通过 WCF 调用函数的每个地方都尝试捕获 CommunicationException 吗?

【问题讨论】:

  • 你在调试器中看到这个异常了吗?那么不用担心 - 这是第一次机会异常,很可能会得到处理。
  • 是的 - 在调试器中。是的 - 似乎是第一次机会例外,因为我可以在之后继续运行该程序。所以;那不担心了吗?只需告诉 VisualStudio 不要再为此类异常困扰我..?

标签: .net wcf exception


【解决方案1】:

CommunicationException 是所有 WCF 相关问题的基本类型,可以在多种情况下出现在客户端:

  • 当您的客户例如请求一个不可用的 URL
  • 当您的服务器太忙而无法处理更多请求并拒绝请求时
  • 当客户端和服务器之间的网络出现问题时(连接断开等)

如果您经常弹出这些内容,则需要更仔细地检查它们是否真的是 CommunicationException 或某种派生类型(FaultException 等等)。

FaultException 表示服务器出现问题 - 如果服务器收到请求但无法正确处理并返回异常或 SOAP 错误,则会抛出该错误。

你注意到异常的信息是什么,是否有InnerException

马克

【讨论】:

  • 谢谢!如果我理解正确,这意味着我应该在客户端的每个 MyFunctionAsync() 调用上尝试捕获 CommunicationException ..?但我认为没有必要在服务器端这样做?在我的情况下,它并不经常发生。需要一段时间发送频繁的请求,直到我能够重现。异常显示“NotFound”,而 InnerException 似乎是 WebException。仅在调试模式下将其作为第一次机会异常..
  • 是的,在客户端上,我肯定会将我的服务调用放在 try..catch 中。在服务器端,您需要检查 IErrorHandler 接口并在您的服务类上实现该接口以捕获服务器上发生的任何异常并将它们转换为 SOAP 错误以完全“干净”;-)
  • 谢谢!将警惕服务器端可能出现的异常,并在有任何异常时进行转换。
  • 我以前从未将异常视为第一次机会异常,但现在我正在使用 MyFunctionCompleted() 回调事件,这样做会在 ..Completed() 内部爆炸。以 TargetInvocationException 的形式出现,CommunicationException 是 InnerException。这一切都预计会偶尔发生,对吧?只要抓住异常,我就不用担心我在沟通中添加了一些愚蠢的东西?
  • 如果在异步调用过程中出现任何异常,异常将发生在 EndMyAsyncCall 方法上,这是正确的。不知道为什么它会抛出 TargetInvocationException - 嗯......可能需要一些额外的调查
【解决方案2】:

你可以试试这样的:

try
{
    ...
    client.Close();
}
catch (CommunicationException e)
{
    ...
    client.Abort();
}
catch (TimeoutException e)
{
    ...
    client.Abort();
}
catch (Exception e)
{
    ...
    client.Abort();
    throw;
}

【讨论】:

  • 在客户端添加了这个,但异常从未到达客户端,因为它是第一次机会异常。但是,在使用 WCF 时,一般情况下是否应该尝试捕获此类异常,或者我可以假设没有抛出通信类型的异常?
  • 如果您需要向客户端发送异常,您还应该在服务器端捕获异常并将其作为故障异常抛出。必须在 WCF 合同中指定抛出哪些错误异常。
  • 真的吗?如果出现某种通信异常,我需要对所有内容执行此操作?有点希望 WCF 能为我处理这个问题。我尝试在双方都捕获异常,但这没有任何改变。仍然只是看到第一次机会异常 - 这是在自动生成的 reference.cs 中的 EndMyServiceFunc() 中。但你是说如果我不处理此类异常,这可能会在某个时候爆发?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多