asp.net-web-api – 带协议缓冲区的ASP.NET WebApi – 错误处理
| 
 语境: 
  
  我现在拥有的: > 3层应用程序 >服务器:ASP.NET WebApi v1 >序列化 – JSON.NET 然而, > JSON.NET很慢 我正在考虑使用protobuf-net而不是JSON.NET.在一个简单的PoC应用程序上,它显示的速度是第一次调用的两倍多,特别是当我为协议缓冲区序列化程序预先生成程序集时. 所以我使用protobuf-net实现了MediaTypeFormatter,除了一件事 – 序列化错误之外,一切运行良好. 这是异常传递给客户端的方式: public class ExceptionShielderAttribute : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext context)
    {
        context.Response = context.Request.CreateErrorResponse(HttpStatusCode.InternalServerError,context.Exception);
    }
}在内部,CreateErrorResponse方法创建HttpError的实例(它继承自Dictionary [string,object])并将其写入内容. 默认情况下,protobuf-net对HttpError一无所知所以我试图将HttpError添加到protobuf运行时模型,如下所示 typeModel.Add(typeof (HttpError),true); 但是,当我打电话时,它没有帮助 typeModel.Compile("ModelSerializer","ModelSerializer.dll")它抛出InvalidOperationException:没有为类型:System.Object定义的序列化程序. 问题: >我有什么办法可以正确地序列化错误,或者我应该避免使用开箱即用的错误分析并在服务器上实现我自己的错误处理,该服务器使用protobuf知道的众所周知的类型? 解决方法
 这是一个使用protobuf-net启用System.Web.Http.HttpError序列化的片段 
  
  
  namespace WS
    using System;
    using System.Runtime.Serialization;
    using System.Web.Http;
    using WebApiContrib.Formatting;
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "DefaultApi",routeTemplate: "api/{controller}/{id}",defaults: new { id = RouteParameter.Optional }
            );
            config.Formatters.Add(new ProtoBufFormatter());
            ProtoBufFormatter.Model.Add(typeof(HttpErrorProto),true);
            var model = ProtoBufFormatter.Model.Add(typeof(HttpError),false);
            model.IgnoreListHandling = true;
            model.SetSurrogate(typeof(HttpErrorProto));
        }
    }
    [DataContract]
    public class HttpErrorProto
    {
        [DataMember(Order = 1)]
        public String ExceptionMessage { get; set; }
        [DataMember(Order = 2)]
        public String ExceptionType { get; set; }
        [DataMember(Order = 3)]
        public String InnerException { get; set; }
        [DataMember(Order = 4)]
        public String MessageDetail { get; set; }
        [DataMember(Order = 5)]
        public String Message { get; set; }
        [DataMember(Order = 6)]
        public String ModelState { get; set; }
        [DataMember(Order = 7)]
        public String StackTrace { get; set; }
        public static implicit operator HttpErrorProto(HttpError error)
        {
            return error == null ? null : new HttpErrorProto
            {
                ExceptionMessage = error.ContainsKey("ExceptionMessage") ? error["ExceptionMessage"] as string : null,ExceptionType = error.ContainsKey("ExceptionType") ? error["ExceptionType"] as string : null,InnerException = error.ContainsKey("InnerException") ? error["InnerException"] as string : null,MessageDetail = error.ContainsKey("MessageDetail") ? error["MessageDetail"] as string : null,Message = error.Message,ModelState = error.ContainsKey("ModelState") ? error["ModelState"] as string : null,StackTrace = error.ContainsKey("StackTrace") ? error["StackTrace"] as string : null
            };
        }
        public static implicit operator HttpError(HttpErrorProto error)
        {
            return error == null ? null : new HttpError
            {
                Message = error.Message
                ...
            };
        }
    }
}(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! | 
- asp.net-mvc-3 – 如何在View中使用ViewBag
- asp.net-mvc – 将域映射到MVC区域
- asp.net-mvc – 什么是“IIS模拟HTTP请求”?
- AJAX分页的代码(后台asp.net)
- asp.net-mvc – 在不同的服务器上将ASP.NET Web API应用程序
- asp.net-mvc – 使用文件扩展名创建ActionResult的推荐方法
- asp.net-web-api – 如何在Azure Service Fabric中的自托管
- 何时使用ASP.NET MVC与ASP.NET Web窗体?
- asp.net-mvc – 用Moq Mocking HttpContextBase
- asp.net-mvc – 使用ViewModels,EditModels和AutoMapper参考
