wcf - 抛出通用的 FaultException

标签 wcf exception

我有一个 WCF 服务,如果出现问题,它会抛出一个通用的 FaultException。
我不知道为什么,有时客户端会捕获非泛型 FaultException 而不是泛型异常。

有谁知道,问题是什么?

最佳答案

您的服务需要处理所有异常并将它们包装到 FaultException 中,其中 T 是您编写的数据协定。因此,第一步是定义一个包含您的异常信息的自定义数据协定:

[DataContract]
public class CustomFault
{
    public string Message { get; set; }
}

然后您指示您的服务契约(Contract),它的方法可能会抛出 FaultException。这允许服务在 wsdl 中公开 CustomFault 类,以便客户端可以生成代理类:
[ServiceContract]
public interface IMyServiceContract
{
    [FaultContract(typeof(CustomFault))]
    void MyMethod(string someArgument);
}

下一步是实现这个接口(interface):
public class MyService : IMyServiceContract
{
    public void MyMethod(string someArgument)
    {
        // Do something here that could throw exceptions but don't catch yet
    }
}

要处理异常,您可以实现 IErrorHandler每当您的服务方法之一引发异常时,都会使用它。此错误处理程序的目的是将异常包装到 FaultException 中:
public class MyErrorHandler : IErrorHandler
{
    public bool HandleError(Exception error)
    {
        return true;
    }

    public void ProvideFault(Exception error, MessageVersion version, ref Message msg)
    {
        var customFault = new CustomFault()
        {
            Message = error.Message,
        };
        var fe = new FaultException<CustomFault>(customFault);
        MessageFault fault = fe.CreateMessageFault();
        string ns = "http://somenamespace/whatever";
        msg = Message.CreateMessage(version, fault, ns);
    }
}

在客户端注册错误处理程序后,您将始终得到 FaultException

关于wcf - 抛出通用的 FaultException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/648084/

相关文章:

c# - 使用 WCF REST 服务进行基本身份验证的内置方法?

c# - 测试 WCF 服务 - 从 XML 文件加载响应

wpf - 有没有一种方法可以在客户端的一个地方处理 WCF 服务器故障?

c++ - 将浮点异常转换为 C++ 异常

Java将堆栈跟踪发送到不同的输出流

c# - WebHttpBinding 与 Http 和 Https

没有证书和 Windows 身份验证的 WCF 消息安全性

java - 有效地使用 UncaughtExceptionHandler

java - 无法捕获算术异常(不过捕获 IllegalArgumentException 没问题)

c# - Delegate.DynamicInvoke - 捕获异常