首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WCF IErrorHandler将FaultException返回到SOAP,将WebHttpException返回到POX和Json端点

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

Stack Overflow用户
提问于 2011-08-25 18:05:57
回答 2查看 3K关注 0票数 17

我有一组SOAP set服务,它们使用IErrorHandler包装异常,具体地说:

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

我现在已经为Json和Pox添加了额外的端点,它们工作得很好,除非发生异常。在Json端点的情况下,FaultException以XML的形式返回。

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

代码语言:javascript
运行
复制
throw new WebFaultException<BusinessFault>(detail, HttpStatusCode.BadRequest);

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

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

然而,MSDN对WebHttpException有一些有趣的评论,即:

当使用WCF REST端点(WebHttpBinding和WebHttpBehavior或WebScriptEnablingBehavior)时,会相应地设置响应上的

状态代码。但是,WebFaultException可以与非REST端点一起使用,其行为类似于常规FaultException。

使用WCF REST端点时,序列化故障的响应格式与非故障响应的确定方式相同。有关WCF REST格式化的更多信息,请参见WCF REST格式化。

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

有没有人想试一试那会是什么样子(.Net4.0 btw)?我想要一个错误处理程序来控制所有的错误!

EN

Stack Overflow用户

发布于 2014-09-09 02:41:59

在我正在开发的一个REST应用程序中,我创建了一个从WebFaultException<T>派生的新类,它将一些额外的数据附加到捕获的服务异常中。通过在派生类的实例上调用CreatingMessageFault()方法,我可以将从错误处理程序的ProvideFault()方法中选择的异常数据作为SOAP错误返回,从而确定正确的消息格式。

我正在使用webHttpBinding绑定除某些第三方服务之外的所有服务。

编辑:添加了代码示例

代码语言:javascript
运行
复制
public class ErrorHandler : IErrorHandler, IServiceBehavior
{       
    public virtual void ProvideFault( Exception error, MessageVersion version, ref Message fault )
    {
        // Include next level of detail in message, if any.
        MyFaultException myFaultException =
            ((error is MyFaultException) &&
                ((MyFaultException)error).Detail != null)
            ? new MyFaultException(error.Message + " - " +
                    ((MyFaultException)error).Detail.Message, error)
            : new MyFaultException( error.Message, error );
        MessageFault messageFault = myFaultException.CreateMessageFault();
        fault = Message.CreateMessage( version, messageFault, myFaultException.Action );
    }
}

代码语言:javascript
运行
复制
/// <summary>
/// Class used to return exception data from my WCF services.
/// </summary>
/// <remarks>
/// This class is used by a web service to pass exception data back and a
/// data object to the client. This class inherits WebFaultException, which
/// is handled specially by the WCF WebServiceHost2 service class and
/// generates a WebException on the client.
/// </remarks>
public class MyFaultException : WebFaultException<BusinessFault>
{
public class MyFaultException : WebFaultException<BusinessFault>
{
    public MyFaultException(string message)
        : this(HttpStatusCode.BadRequest, message) { }

    public MyFaultException(HttpStatusCode statusCode, string message)
        : base(new BusinessFault(message), statusCode) { }
}

然后,在您的服务中,您可以抛出异常以将故障数据传递给您的客户端:

代码语言:javascript
运行
复制
        try
        {
            // Successful operation proceeds normally.
        }
        catch (ApplicationException e)
        {
            // Failure generates MyFaultException.
            throw new MyFaultException("Operation failed with " + e.Message);
        }
票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7188519

复制
相关文章

相似问题

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