首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >抛出泛型FaultException

抛出泛型FaultException
EN

Stack Overflow用户
提问于 2009-03-15 16:30:00
回答 7查看 13.9K关注 0票数 4

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

有人知道问题出在哪里吗?

EN

回答 7

Stack Overflow用户

发布于 2009-03-15 16:45:36

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

代码语言:javascript
运行
复制
[DataContract]
public class CustomFault
{
    public string Message { get; set; }
}

然后告诉您的服务契约,它的方法可能抛出FaultException。这允许服务在wsdl中公开CustomFault类,以便客户端可以生成代理类:

代码语言:javascript
运行
复制
[ServiceContract]
public interface IMyServiceContract
{
    [FaultContract(typeof(CustomFault))]
    void MyMethod(string someArgument);
}

下一步是实现这个接口:

代码语言:javascript
运行
复制
public class MyService : IMyServiceContract
{
    public void MyMethod(string someArgument)
    {
        // Do something here that could throw exceptions but don't catch yet
    }
}

要处理异常,您可以实现IErrorHandler,只要某个服务方法抛出异常,就会使用它。此错误处理程序的目的是将异常包装到FaultException中

代码语言:javascript
运行
复制
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。

票数 18
EN

Stack Overflow用户

发布于 2011-01-08 02:31:12

如果您的客户端不能访问异常类型本身( FaultException< T>上的< T>),那么就会抛出FaultException的非泛型版本。我花了几个小时试图弄清楚这一点,当我在msdn论坛上发现this时,我终于意识到了这一点。如果在将异常抛出服务之前有一些迹象表明异常已经更改,那就太好了,但事实并非如此。

票数 5
EN

Stack Overflow用户

发布于 2009-03-15 17:12:30

当服务抛出一些其他未捕获的异常时,将引发非泛型FaultException。您需要找出异常是什么,如果它是一个bug,则修复它,或者确定它是您想要向您的客户端公开的东西,然后将其包装在通用FaultException中并适当地添加FaultContract

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/648084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档