2016-11-22 31 views
0

我試圖控制來自Web API 2 OData v4服務的錯誤響應中的細節存在。當我打我的本地IIS託管的OData服務,我得到的是這樣的:如何控制OData錯誤細節的存在

{ 
    "error": { 
    "code": "Error code", 
    "message": "Message from exception filter", 
    "details": [ 
     { 
     "code": "Detail code", 
     "message": "Details here" 
     } 
    ], 
    "innererror": { 
     "message": "Exception message here", 
     "type": "Exception type", 
     "stacktrace": "Stack trace here" 
    } 
    } 
} 

當我採取相同的服務,並部署在遠程服務器上,並用相同的消息打它,我得到這個:

{ 
    "error": { 
    "code": "Error code", 
    "message": "Message from exception filter" 
    } 
} 

我在猜測「innererror」和「details」部分被壓制,因爲我在遠程調用服務?我很高興「innererror」部分被取消 - 我不想泄露這些細節 - 但我想公開「細節」部分,以便我可以提供關於某些錯誤的更多反饋。有沒有簡單的方法來實現這一點?

謝謝!

回答

2

我正在使用Request.CreateErrorResponse(myHttpStatusCode,myODataError)創建我的OData錯誤響應。看看System.Web.Http.OData.Extensions.HttpRequestMessageExtensions.CreateErrorResponse的源代碼,看起來如果Request.ShouldIncludeErrorDetail爲false,那麼僅使用「code」和「message」項目重新創建ODataError。我的解決方案是創建另一個過載/延伸CreateErrorResponse的它接受控制的細節部分是否應包含一個參數:

public static HttpResponseMessage CreateErrorResponse(this HttpRequestMessage request, 
      HttpStatusCode statusCode, ODataError oDataError, bool includeDetails) 
{ 
    if (request.ShouldIncludeErrorDetail()) 
    { 
     return request.CreateResponse(statusCode, oDataError); 
    } 
    else 
    { 
     return request.CreateResponse(
      statusCode, 
      new ODataError() 
      { 
       ErrorCode = oDataError.ErrorCode, 
       Message = oDataError.Message, 
       Details = includeDetails ? oDataError.Details : null 
      }); 
    } 
} 

這允許獨立於「方式」部分的抑制「innererror」部分。