【问题标题】:What exception type should be thrown with a WCF Service?WCF 服务应该抛出什么异常类型?
【发布时间】:2009-10-05 13:09:21
【问题描述】:

我正在将代码从 ASMX 转换为 WCF。在我的 ASMX Web 服务中,我抛出 SOAP 异常,例如:

if (ex.InnerException != null)
                {
                    SoapException se = new SoapException(ex.Message, SoapException.ServerFaultCode, Context.Request.Url.AbsoluteUri, ex.InnerException);
                    throw se;
                }

我应该向调用我的服务的 WCF 客户端抛出什么样的异常?我猜 SOAP 异常是错误的类型,因为测试客户端不认为它是一个有效的错误,只是说 - web 服务中发生了内部错误。

【问题讨论】:

    标签: wcf


    【解决方案1】:

    基本上,在 WCF 服务中,最好只抛出 FaultException(或 FaultException<T>)。

    这是因为两件事:由于 WCF 被设计为可互操作的(您的客户端很容易成为非 .NET 应用程序),因此您不应该使用 .NET 异常 - 它们太特定于平台。第二:如果您使用 FaultExceptions(被翻译成 SOAP 错误),您的通道(客户端和服务器之间的连接)将不会被拆除或“故障”。服务器端的 WCF 运行时将所有未处理的 .NET 异常视为“严重”异常,因此将通道置于故障状态,假设发生了非常糟糕的事情。

    如果您的频道出现故障,您将无法再使用它 - 您必须关闭您的客户端代理并从头开始重新创建它。

    如果您希望(或必须)具有很强的互操作性,您可以在一个单独的文件中定义您的 SOAP 故障是 故障合同(类似于数据合同),然后您会抛出 @ 987654323@ 其中 T 将是您的过错合同之一。如果您在任何一方都严格使用 .NET,那么您也可以将 .NET 异常作为泛型类型 T 粘贴到 FaultException 中,如果您愿意的话 - 通道不会出现故障(例如,您可以抛出 FaultException<InvalidOperationException> 并因此返回信号出了什么问题)。

    【讨论】:

      【解决方案2】:

      在 WCF 中,您使用 FaultException。参见例如here

      【讨论】:

        猜你喜欢
        • 2011-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-12
        • 1970-01-01
        相关资源
        最近更新 更多