首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用包含System.Exception的自定义FaultContract对象会导致“添加服务引用”失败

使用包含System.Exception的自定义FaultContract对象会导致“添加服务引用”失败
EN

Stack Overflow用户
提问于 2011-01-11 17:49:17
回答 4查看 3K关注 0票数 3

我刚注意到一件特别的事。我有一个通过basicHttpBinding发布的内部股票服务和一个启用了元数据的customBinding (http+binary)。我还包含了一个用于http的mex端点。我们使用Visual Studio2008和VB.NET

就在最近,我们注意到我们无法在其他项目中成功地添加对此服务的服务引用。它将生成的是我们通过FaultContract包含的第一个自定义异常(实际上,只有一个类型)。如果我添加一个简单的web引用,它也会正常工作。此外,WcfClient.exe在加载服务时也没有问题。仅仅使用VS.NET添加服务引用将不起作用。

在服务中,此异常继承自exception,并标记为可序列化。这就是你应该做的,不是吗?

不管怎么说,这让我很困惑。如果我删除这个自定义异常的FaultContract,一切都会正常工作。我可以添加一个服务引用,没问题。但是,有没有办法让我的自定义异常仍然存在呢?这是一个已知的问题吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-02-08 09:51:04

今天我自己也遇到了这个问题。解决方案是在FaultContract中使用一个不是继承自Exception的对象。如果您查看用于FaultExceptionFaultContract的MSDN文档,您会发现官方示例使用的是普通类(具有DataContact属性),而不是扩展FaultException.Detail异常的类。我不确定为什么异常会导致添加服务引用失败,但我怀疑这与序列化或检索自定义异常的类型信息有关。我已经包含了之前和之后的示例实现,以演示工作方法。

之前的(不起作用):

代码语言:javascript
复制
[ServiceContract]
public interface IMyService
{
    [OperationContract]
    [FaultContract(typeof(MyException))]
    MyResults MyServiceOperation(string myParameter);
}

[Serializable]
public class MyException : Exception
{
    public string CustomData { get; set; }
}

[ErrorHandlerBehavior(typeof(MyErrorHandler))]
public class MyService : IMyService
{
    public MyResults MyServiceOperation(string myParameter)
    {
        ...
        throw new MyModelException { CustomData = "42" };
        ...
    }
}

public class MyErrorHandler : IErrorHandler
{
    public bool HandleError(Exception error) { return false; }

    public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
    {
        try { throw error; }
        catch (MyModelException ex)
        {
            var faultEx = new FaultException<MyException>(new MyException { CustomData = ex.CustomData });
            fault = Message.CreateMessage(version, faultEx.CreateMessageFault(), faultEx.Action);
        }
        catch { /* Supress all others */ }
    }
}

工作后():

代码语言:javascript
复制
[ServiceContract]
public interface IMyService
{
    [OperationContract]
    [FaultContract(typeof(MyFault))]
    MyResults MyServiceOperation(string myParameter);
}

[DataContract]
public class MyFault
{
    [DataMember]
    public string CustomData { get; set; }
}

[ErrorHandlerBehavior(typeof(MyErrorHandler))]
public class MyService : IMyService
{
    public MyResults MyServiceOperation(string myParameter)
    {
        ...
        throw new MyModelException { CustomData = "42" };
        ...
    }
}

public class MyErrorHandler : IErrorHandler
{
    public bool HandleError(Exception error) { return false; }

    public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
    {
        try { throw error; }
        catch (MyModelException ex)
        {
            var faultEx = new FaultException<MyFault>(new MyFault { CustomData = ex.CustomData });
            fault = Message.CreateMessage(version, faultEx.CreateMessageFault(), faultEx.Action);
        }
        catch { /* Supress all others */ }
    }
}

来源:Max Strini使用了他的代码,并帮助找到了这个问题的解决方案。

票数 8
EN

Stack Overflow用户

发布于 2012-08-01 04:06:41

我找到了下面这篇关于如何使用继承自System.Exception的objected创建错误协定的文章:http://blog.clauskonrad.net/2008/06/wcf-and-custom-exceptions.html

然而,它对我来说并不起作用。我怀疑它对我不起作用的原因是我使用的是BasicHttp绑定,而不是.NET-.NET绑定。

票数 1
EN

Stack Overflow用户

发布于 2011-09-02 21:06:54

我也谈到了这个问题。我最终使用svcutil.exe来生成代理,似乎没有遇到同样的问题。

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

https://stackoverflow.com/questions/4656257

复制
相关文章

相似问题

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