【发布时间】:2014-06-06 13:14:17
【问题描述】:
上下文:
我现在拥有的:
- 三层应用
- 客户端-服务器通信
- 服务器:ASP.NET WebApi v1
- 客户端:HttpClient
- 序列化 - JSON.NET
然而,
- 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: No serializer defined for type: System.Object. 可能是由于 protobuf-net 不支持的 Dictionary[string, object] 类型。
问题:
我可以做些什么来正确序列化错误,或者我应该避免使用开箱即用的错误处理并在使用 protobuf 知道的众所周知的类型的服务器上实现我自己的错误处理吗?
protobuf 是解决我的问题的好选择吗?
【问题讨论】:
标签: asp.net-web-api error-handling json.net protocol-buffers protobuf-net