2014-10-06 54 views
1

spec for Error Response說刪除的OData innererror:如何從生產服務

爲innererror名稱/值對的值必須是一個對象。該對象的內容是服務定義的。通常這個對象包含有助於調試服務的信息。內部錯誤名稱/值對應該只在開發環境中使用,以防止圍繞信息泄露的潛在安全問題。

該規範是正確的,在asp.net的innererror屬性給出了一個有用的信息,如堆棧跟蹤,但我真的不想與大家分享我的API客戶

由於這一信息呢,我還沒有找到從響應中刪除這個屬性的方法,甚至有可能嗎?

回答

3

是的,這是可能的,但是非常麻煩。

你需要做四件事情:

首先,你應該從默認實現派生自己的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()); 
+1

感謝提供一種方式,但我希望你打算做下個版本里就輕鬆了許多。對於每個書面應用程序規範所要求的事情做這麼多工作是錯誤的。再次,謝謝。 – gdoron 2014-10-09 18:57:25

+2

@gdoron你說得對。讓我把這個問題提交給團隊,看看我們是否可以改進它。 – 2014-10-10 06:52:32

+0

當您使用它時,請本地化錯誤消息並從消息中刪除調試信息。 「消息名/值對的值必須是一個可讀的,依賴於語言的錯誤表示,TheContent-Language頭必須包含來自[RFC5646]的語言代碼,該代碼對應於寫入消息值的語言「。 – gdoron 2014-10-10 08:13:08