【问题标题】:If i dont catch exception on Server side in WCF, will it crash the server side app?如果我没有在 WCF 的服务器端捕获异常,它会导致服务器端应用程序崩溃吗?
【发布时间】:2009-11-27 02:25:51
【问题描述】:

作为标题,我应该在服务器端捕获异常吗?

【问题讨论】:

    标签: wcf exception


    【解决方案1】:

    我想将异常分为以下两种类型,因为我不确定你在说哪一种:

    WCF 通信异常:
    这些异常不太可能给您的服务器端应用程序带来麻烦。所以你不必担心它们。您只需要在客户端应用程序中小心。

    应用程序例外:
    (显然)您确实需要捕获它们,否则您的服务器端应用程序将崩溃。

    【讨论】:

      【解决方案2】:

      是的,你应该 - 无论如何!

      首先,服务器端未捕获的异常将“故障”通道,例如将客户端和服务器之间的通道置于“紧急模式” - 无法再调用,您需要从客户端关闭(或中止)通道并重新建立连接。

      其次,当然,未处理的异常会使您的服务器代码崩溃 - 但是,默认情况下,您的 WCF 调用无论如何都应该是“每次调用”,这意味着,每个传入的请求都将获得一个全新的、新实例化的您的服务器类的对象,并且在调用结束时,无论如何它都会被处理掉。所以这真的不是那么糟糕......

      WCF 中有一个名为IErrorHandler 的接口,您可以在服务器端实现该接口。它提供的是捕获任何异常并将它们转换为“可互操作”的 SOAP 错误的能力,这些错误将通过通信通道发送回,而不会导致它进入恐慌模式。

      有几个IErrorHandler 实现基本上允许您将其作为服务行为动态插入 - 无论是在服务器的配置中,还是在您的服务类代码中作为属性。查看 this blog post 获取其中一个示例(还有更多示例 - 只需 google 即可)。

      【讨论】:

      • @marc_s:我使用 WCF 编写了一个客户端-服务器应用程序,它已经投入生产了六个月(还没有停机)。我没有在服务器中编写一行代码来捕获WCF 通信异常。但是是的,我确实使用了每次调用模式,我很想知道如果我将其更改为“每次会话”或“单例”模式,我必须在服务器中进行哪些更改......
      • 虽然从我当时读到的任何东西(我正在学习 WCF),只有“每次调用”才有意义。
      【解决方案3】:

      预计会出现例行异常;最好将它们冒泡为 faults(WCF 术语 - 查找 FaultException),但无论哪种方式,异常都会简单地转换到网络上并由客户端处理。 WCF 客户端真的不喜欢获得异常,这通常是代理的终端(客户端应该清理他们现有的代理并启动一个新的代理以获得新的会话等)。但是您的服务器进程(减去 borked 会话)将继续运行并为请求提供服务。

      当然有一类非常讨厌和服务器致命的异常 - 堆栈溢出、内存不足、线程中止等。但是对于这些,您无能为力无论如何

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-13
        • 2013-01-13
        • 1970-01-01
        • 2013-03-11
        • 1970-01-01
        • 2011-01-16
        • 1970-01-01
        • 2014-09-30
        相关资源
        最近更新 更多