是的,這是可能的,但是非常麻煩。
你需要做四件事情:
首先,你應該從默認實現派生自己的OData錯誤串。從default ODataErrorSerializer的差異將覆蓋包含下面的代碼的方法:
bool includeDebugInformation = oDataError.InnerError != null;
將其更改爲
bool includeDebugInformation = oDataError.InnerError == null;
或簡單地設置您的重寫實現價值false
。假設你自己的OData錯誤序列化器被稱爲MyODataErrorSerializer
。
然後,您需要從默認值中派生出您自己的OData序列化器提供程序。從DefaultODataSerializerProvider差異會改變如下代碼:
private static readonly ODataErrorSerializer _errorSerializer = new ODataErrorSerializer();
到自己的錯誤串行:
private static readonly ODataErrorSerializer _errorSerializer = new MyODataErrorSerializer();
比方說,你自己的序列提供程序被調用MyODataSerializerProvider
。
之後,做類似的事情ODataMediaTypeFormatters
。從DefaultODataMediaTypeFormatters導出MyODataMediaTypeFormatters
,其使用MyODataSerializerProvider
而不是DefaultODataSerializerProvider
。
最後,下面的代碼添加到您的Web API的OData實現:
config.Formatters.InsertRange(0, ODataMediaTypeFormatters.Create());
感謝提供一種方式,但我希望你打算做下個版本里就輕鬆了許多。對於每個書面應用程序規範所要求的事情做這麼多工作是錯誤的。再次,謝謝。 – gdoron 2014-10-09 18:57:25
@gdoron你說得對。讓我把這個問題提交給團隊,看看我們是否可以改進它。 – 2014-10-10 06:52:32
當您使用它時,請本地化錯誤消息並從消息中刪除調試信息。 「消息名/值對的值必須是一個可讀的,依賴於語言的錯誤表示,TheContent-Language頭必須包含來自[RFC5646]的語言代碼,該代碼對應於寫入消息值的語言「。 – gdoron 2014-10-10 08:13:08