語境:ASP.NET的WebAPI與Protocol Buffers的 - 錯誤處理
我現在擁有的一切:
- 3層應用
- 客戶端服務器通信
- 服務器: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的一個實例(其從詞典[字符串對象]繼承),並將其寫入到該內容。
默認情況下,protobuf網對此一無所知HttpError所以我嘗試添加HttpError到protobuf的運行模式如下
typeModel.Add(typeof (HttpError), true);
,但它並沒有幫助,當我打電話
typeModel.Compile("ModelSerializer", "ModelSerializer.dll")
它拋出InvalidOperationException:沒有爲類型System.Object定義的序列化程序。 可能由於protobuf-net不支持的Dictionary [string,object]類型。
問題:
有什麼我能做的正確序列化的錯誤,或者我應該避免使用外的開箱errorhanding和實現自己的錯誤處理,使用以及在服務器上 - protobuf知道的知識類型?
protobuf是我的問題的不錯選擇嗎?
感謝您的回答,使System.Web.Http.HttpError的系列化。這雖然沒有幫助。我按照你所說的做了,但typeModel.Compile()拋出ArgumentException:重複的數據(列表,集合等)具有內置行爲,不能使用代理。 – olldman
@olldman是HttpError的一個列表? –
它是一個字典[字符串,對象] – olldman