gpt4 book ai didi

asp.net-web-api - 带有 Protocol Buffer 的 ASP.NET Web Api - 错误处理

转载 作者:行者123 更新时间:2023-12-01 09:57:03 24 4
gpt4 key购买 nike

上下文:

我现在所拥有的:

  • 三层应用
  • 客户端-服务器通信
  • 服务器:ASP.NET WebApi v1
  • 客户端:HttpClient
  • 序列化 - JSON.NET

  • 然而,
  • JSON.NET 慢
  • JSON.NET 在第一次调用时甚至更慢(我认为这是因为动态生成序列化程序集)。这对我来说太慢了 - 根据我需要尽可能优化第一次调用的要求。

  • 我正在考虑使用 protobuf-net而不是 JSON.NET。在一个简单的 PoC 应用程序上,它显示的结果快两倍多,即使是第一次调用,尤其是当我预先生成了 Protocol Buffer 序列化程序的程序集时。

    所以我已经使用 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-net 不支持的 Dictionary[string, object] 类型。

    问题:
  • 我可以做些什么来正确地序列化错误,还是应该避免使用开箱即用的错误处理并在使用 protobuf 知道的众所周知的类型的服务器上实现我自己的错误处理?
  • 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-web-api - 带有 Protocol Buffer 的 ASP.NET Web Api - 错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24082759/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com