2

下午好,

我遇到了 WCF 和 IntelliTrace 的一个奇怪问题。我有一个应用程序,我正在使用 basicHttpBinding 使用本地托管的 WCF 端点(VS2010 中内置的开发服务器)进行测试。应用程序一直在正常运行:没有异常正在进入应用程序,所有 WCF 调用都在返回数据。

突然,我决定查看 IntelliTrace 输出,并注意到我对 WCF 的第一次调用引发了两个异常:

Exception:Thrown: "No connection could be made because the target machine actively refused it" (System.Net.Sockets.SocketException)
A System.Net.Sockets.SocketException was thrown: "No connection could be made because the target machine actively refused it"
Exception:Caught: "No connection could be made because the target machine actively refused it" (System.Net.Sockets.SocketException)
A System.Net.Sockets.SocketException was caught: "No connection could be made because the target machine actively refused it"

我已将应用程序简化为一个微不足道的用例:

    ServiceClient client = new ServiceClient();
    string[] output = client.LegacyCheck("username");
    Console.WriteLine(output[0]);
    Console.WriteLine(client.GetData(65));

我得到了同样的行为。第二个调用没有与之关联的异常。

我很困惑。如果连接被拒绝,那么为什么异常不能弥补应用程序?为什么在 2 次失败的尝试后它会成功?

任何帮助表示赞赏!

4

1 回答 1

3

对于它的价值,我在 IronPython/WPF 应用程序中也注意到了这种行为。我最终意识到 Intellitrace 只是向您显示在正常操作期间引发和捕获的所有异常,即使它是 BCL 或其他库的一部分。

当然,您只需要担心未处理的异常(在它们中断您的执行之后,您通常会在 IntelliTrace 中将这些异常视为...的长链。Thrown: Caught: Thrown: Caught:一直到Thrown:最后一行,因为异常是没有被抓住。

我愿意打赌的是,WCF 代码try首先会捕获 SocketExceptions,然后继续其愉快的方式。如果不是 IntelliTrace,你永远不会看到这个 :)

于 2010-10-20T18:25:55.130 回答