WCF从客户端

时间:2015-09-18 16:48:17

标签: c# wcf error-handling

我正在尝试将附加信息附加到FaultException WCF服务,然后在客户端中访问它。我正在使用IErrorHandler ProvideFault方法,因为我的服务有很多公开的方法,我想在一个地方定义错误处理逻辑。

我已经定义了一个数据类CoreFault

[DataContract]
public class CoreFault
{
    [DataMember]
    public string Foo { get; set; }
}

并实施IErrorHandler接口以返回强类型FaultException

public class ErrorHandler : IErrorHandler
{
    public void ProvideFault(Exception error, MessageVersion version, ref Message message)
    {
        var faultException = new FaultException<CoreFault>(
            new CoreFault
            {
                Foo = "Bar"
            },
            "An error occurred",
            null);

        var fault = faultException.CreateMessageFault();

        message = Message.CreateMessage(
            version,
            fault,
            faultException.Action);
    }
}

我的服务是在代码中配置的:

public static void Configure(ServiceConfiguration config)
{
    (config.Description.Behaviors[0] as ServiceBehaviorAttribute).IncludeExceptionDetailInFaults = true;
    config.Description.Behaviors.Add(new ErrorHandlingBehaviour());
}

我在创建消息后打破了代码,它显示了以下XML:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Header/>
    <s:Body>
        <s:Fault>
            <faultcode>s:Client</faultcode>
            <faultstring xml:lang="en-GB">An error occurred</faultstring>
            <detail>
                <CoreFault xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/EmployerPortal.Models.Faults">
                    <Foo>Bar</Foo>
                </CoreFault>
            </detail>
        </s:Fault>
    </s:Body>
</s:Envelope>

但是在我的客户端中,抛出的错误是FaultException而不是FaultException<CoreFault>,并且额外的信息会丢失。

try
{
    // Call service here
    ...
}
catch (FaultException<CoreFault> e)
{
    throw;
}
catch (FaultException e)
{
    // This line is hit
    throw;
}

如何将Foo传递给客户端,以便在处理异常时可以访问它?

0 个答案:

没有答案