WCF IErrorHandler将FaultException返回到SOAP和WebHttpException到POX和Json端点

Reb*_*cca 17 rest wcf soap

我有一组使用IErrorHandler包装异常的SOAP Web服务,具体来说:

public sealed class ErrorHandler : IErrorHandler
{
    public bool HandleError(Exception error)
    {
        return true;
    }

    public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
    {
        // don't wrap existing fault exceptions
        if ((error is FaultException)) return;

        // our basic service fault
        var businessFault = new BusinessFault { FaultMessage = error.Message, FaultReference = "Internal" };

        // Resource based faultReason
        var faultReason = new FaultReason(Properties.Resources.BusinessFaultReason);
        var faultcode = FaultCodeFactory.CreateVersionAwareSenderFaultCode(InternalFaultCodes.BusinessFailure.ToString(), Service.Namespace);

        var faultException = new FaultException<BusinessFault>(
            businessFault,
            faultReason,
            faultcode);

        // Create message fault
        var messageFault = faultException.CreateMessageFault();

        // Create message using Message Factory method
        fault = Message.CreateMessage(version, messageFault, faultException.Action);
    }
}
Run Code Online (Sandbox Code Playgroud)

我现在已经为Json和Pox添加了额外的端点,这些端点工作正常,除非发生异常.对于Json端点,FaultException以XML格式返回.

我从其他SO帖子中了解到,在REST的情况下,我会更好地抛出WebHttpException:

throw new WebFaultException<BusinessFault>(detail, HttpStatusCode.BadRequest);
Run Code Online (Sandbox Code Playgroud)

或覆盖ProvideFault中的响应消息属性,因此:

var wbf = new WebBodyFormatMessageProperty(WebContentFormat.Json);
fault.Properties.Add(WebBodyFormatMessageProperty.Name, wbf);

var rmp = new HttpResponseMessageProperty
{
    StatusCode = System.Net.HttpStatusCode.BadRequest,
    StatusDescription = "See fault object for more information."
};
fault.Properties.Add(HttpResponseMessageProperty.Name, rmp);
Run Code Online (Sandbox Code Playgroud)

但是,MSDN对WebHttpException有一些有趣的评论,即:

使用WCF REST端点(WebHttpBinding和WebHttpBehavior或WebScriptEnablingBehavior)时,将相应地设置响应上的HTTP状态代码.但是,WebFaultException可以与非REST端点一起使用,其行为类似于常规FaultException.

使用WCF REST端点时,序列化故障的响应格式与非故障响应的确定方式相同.有关WCF REST格式的详细信息,请参阅WCF REST格式.

因此,我建议我需要将当前的ProvideFault方法转换为提供新的WebHttpException(包装任何现有的Exceptions或FaultExceptions),然后SOAP仍然可以正常工作.

有人愿意尝试一下(.Net4.0 btw)吗?我想要一个错误处理程序来统治它们!

Ami*_*ber 0

我的印象是,使用webHttpBinding是一种获得 JSON/POX/SOAP 的“一体化”功能的方法,而不是为每个功能使用单独的绑定(即wsHttpBindingbasicHttpBinding等等)。那么,您是否能够直接抛出WebHttpException,然后无论技术如何,都能为您提供所需的所有错误详细信息?