首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >wcf rest ierrorhandler webfaultexception

wcf rest ierrorhandler webfaultexception
EN

Stack Overflow用户
提问于 2012-09-17 18:03:40
回答 1查看 4.1K关注 0票数 3

我有一个WCF4REST服务,它将由一个java客户端和一个c# mvc3客户端使用。响应内容需要作为json返回。

我希望能够以一致的方式将任何异常/故障返回给客户。我读到应该使用WebFaultException,实际上它工作得很好。

但是,我不想用WebFaultExceptions污染我的应用程序逻辑项目,因为它可能会被非web项目使用。

因此,我考虑了在WCF Rest服务中实现IErrorHandler来捕获任何异常,然后对于特定的异常(即ValidationException ),将异常作为错误返回到WebFaultException中。但是,这似乎不起作用,当调用form fiddler时,我得到以下Http 504响应

Fiddler ReadResponse()失败:服务器未返回对此请求的响应。

我已经将代码简化到最基本的部分,以显示我正在做的事情的本质。

代码语言:javascript
复制
public void ProvideFault(Exception error, 
                         MessageVersion version, 
                         ref Message fault)
{
    var ex = new WebFaultException<Exception>(
                                      new Exception("you can't do that"), 
                                      HttpStatusCode.Unauthorized);

    var xmf = ex.CreateMessageFault();
    fault = Message.CreateMessage(version,
                                  null,
                                  xmf,
                                 new DataContractJsonSerializer(xmf.GetType()));
}

我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-17 21:31:23

以下是来自Carlos's blog的示例代码。这在过去对我很有帮助。

代码语言:javascript
复制
public class ValidationAwareErrorHandler : IErrorHandler
{
    IErrorHandler originalErrorHandler;
    public ValidationAwareErrorHandler(IErrorHandler originalErrorHandler)
    {
        this.originalErrorHandler = originalErrorHandler;
    }

    public bool HandleError(Exception error)
    {
        return error is ValidationException || this.originalErrorHandler.HandleError(error);
    }

    public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
    {
        ValidationException validationException = error as ValidationException;
        if (validationException != null)
        {
            fault = Message.CreateMessage(version, null, new ValidationErrorBodyWriter(validationException));
            HttpResponseMessageProperty prop = new HttpResponseMessageProperty();
            prop.StatusCode = HttpStatusCode.BadRequest;
            prop.Headers[HttpResponseHeader.ContentType] = "application/json; charset=utf-8";
            fault.Properties.Add(HttpResponseMessageProperty.Name, prop);
            fault.Properties.Add(WebBodyFormatMessageProperty.Name, new WebBodyFormatMessageProperty(WebContentFormat.Json));
        }
        else
        {
            this.originalErrorHandler.ProvideFault(error, version, ref fault);
        }
    }

    class ValidationErrorBodyWriter : BodyWriter
    {
        private ValidationException validationException;
        Encoding utf8Encoding = new UTF8Encoding(false);

        public ValidationErrorBodyWriter(ValidationException validationException)
            : base(true)
        {
            this.validationException = validationException;
        }

        protected override void OnWriteBodyContents(XmlDictionaryWriter writer)
        {
            writer.WriteStartElement("root");
            writer.WriteAttributeString("type", "object");

            writer.WriteStartElement("ErrorMessage");
            writer.WriteAttributeString("type", "string");
            writer.WriteString(this.validationException.ValidationResult.ErrorMessage);
            writer.WriteEndElement();

            writer.WriteStartElement("MemberNames");
            writer.WriteAttributeString("type", "array");
            foreach (var member in this.validationException.ValidationResult.MemberNames)
            {
                writer.WriteStartElement("item");
                writer.WriteAttributeString("type", "string");
                writer.WriteString(member);
                writer.WriteEndElement();
            }
            writer.WriteEndElement();

            writer.WriteEndElement();
        }
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12457039

复制
相关文章

相似问题

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