当前位置:  开发笔记 > 编程语言 > 正文

抛出一般的FaultException

如何解决《抛出一般的FaultException》经验,为你挑选了2个好方法。

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

有谁知道,问题是什么?



1> Darin Dimitr..:

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

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

然后,您指示您的服务合同,其方法可能会抛出FaultException .这允许服务在wsdl中公开CustomFault类,以便客户端可以生成代理类:

[ServiceContract]
public interface IMyServiceContract
{
    [FaultContract(typeof(CustomFault))]
    void MyMethod(string someArgument);
}

下一步是实现此接口:

public class MyService : IMyServiceContract
{
    public void MyMethod(string someArgument)
    {
        // Do something here that could throw exceptions but don't catch yet
    }
}

要处理异常,您可以实现IErrorHandler,只要您的某个服务方法抛出异常,就会使用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);
        MessageFault fault = fe.CreateMessageFault();
        string ns = "http://somenamespace/whatever";
        msg = Message.CreateMessage(version, fault, ns);
    }
}

一旦注册了错误处理程序,在客户端,您将始终获得FaultException .



2> Drew..:

如果您的客户端无法访问Exception类型本身(FaultException 上的),则抛出FaultException的非泛型版本.我花了好几个小时试图解决这个问题,并在我在msdn论坛上发现这个时最终意识到这一点.如果有一些迹象表明异常在将其退出服务之前已经改变了,那就太棒了,但事实并非如此.

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有