我只是注意到了一些特别的东西。我有一项内部库存服务,该服务通过BasichTTPBinding发布,以及启用元数据的自定义订阅(HTTP+二进制)。我还提供了HTTP的MEX端点。我们使用Visual Studio 2008&vb.net

就在最近,我们注意到我们无法在其他项目中成功地为此服务添加服务参考。它将生成的只是我们通过Falltract所包含的第一个自定义例外(实际上,只有1个类型)。如果我添加一个简单的网络参考,它也可以正常工作。另外,wcfclient.exe在加载服务方面也没有问题。只是vs.net添加服务参考将无效。

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

无论如何,这让我感到困惑。如果我删除此自定义异常的fustaltarts,则一切正常。我可以添加服务参考,没问题。但是有什么方法我仍然可以有自定义例外?这是一个已知问题吗?

有帮助吗?

解决方案

我今天遇到了这个。该解决方案是使用不从故障合同中的异常继承的对象。如果您查看MSDN文档 FARSEDEXCEPTION犯罪收入 您会看到官方示例使用普通类(带有DataContact属性),而不是扩展fallexception.detail的异常。我不确定为什么异常会导致添加服务引用导致失败,但我怀疑这与序列化或检索类型信息有关自定义异常而言。我在实施示例之前和之后都包括了演示工作方法。

以前(不起作用):

[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 */ }
    }
}

(工作)之后:

[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 */ }
    }
}

资源: 马克斯·斯特里尼 用于使用他的代码并帮助找到解决此问题的解决方案。

其他提示

我找到了以下文章,有关如何使用从系统继承的反对的反对合同创建故障合同。 http://blog.clauskonrad.net/2008/06/wcf-and-custom-exceptions.html

但是,这对我不起作用。我怀疑它对我不起作用的原因是我使用basichttp绑定而不是.net -.net绑定。

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

我遇到了相同的问题,并通过使用svcutil.exe生成代理来解决它。我已经按照MSDN推荐的方式进行了自定义故障设置,但“添加服务参考”并未包含代理中的故障合同。然后我使用了svcutil,它像魔术一样工作:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top