2013-10-15 102 views
6

我很想知道在ODataController中引發異常的最佳做法。ASP.NET Odata Web API的錯誤處理

如果您在方法中引發異常,則默認將其轉換爲500的響應代碼,並且內容具有有關錯誤的詳細信息。我希望明確響應代碼並在無效密鑰的情況下發送400。

例如:如果輸入請求有一個無效鍵想要返回一個400的HttpResponseCode,並且內容應該有類似於引發異常的錯誤細節。

非常感謝您的輸入

+0

鑰匙未發現應提高其轉換404 – qujck

回答

1

使用HttpResponseException
例如throw new HttpResponseException(HttpStatusCode.NotFound);
詳情請見here

13

的OData(至少從V3)使用specific json表示錯誤:

{ 
    "error": { 
     "code": "A custom error code", 
     "message": { 
      "lang": "en-us", 
      "value": "A custom long message for the user." 
     }, 
     "innererror": { 
      "trace": [...], 
      "context": {...} 
     } 
    } 
} 

微軟的.Net包含Microsoft.Data.OData.ODataErrorMicrosoft.Data.OData.ODataInnerError類,以在服務器端的OData錯誤。

要形成正確的OData錯誤響應(HttpResponseMessage),包含錯誤的詳細信息,您可以:使用System.Web.OData.Extensions.HttpRequestMessageExtensions.CreateErrorResponse方法

1)形式和控制器的行動返回HttpResponseMessage

return Request.CreateErrorResponse(HttpStatusCode.Conflict, new ODataError { ErrorCode="...", Message="...", MessageLanguage="..." })); 

2)拋出HttpResponseException使用同樣的方法創建HttpResponseMessage

throw new HttpResponseException(
    Request.CreateErrorResponse(HttpStatusCode.NotFound, new ODataError { ErrorCode="...", Message="...", MessageLanguage="..." })); 

3)拋出自定義類型異常並使用網絡API操作篩選

public class CustomExceptionFilterAttribute : ExceptionFilterAttribute 
{ 
    public override void OnException(HttpActionExecutedContext context) 
    { 
     if (context.Exception is CustomException) 
     { 
      var e = (CustomException)context.Exception; 

      var response = context.Request.CreateErrorResponse(e.StatusCode, new ODataError 
      { 
       ErrorCode = e.StatusCodeString, 
       Message = e.Message, 
       MessageLanguage = e.MessageLanguage 
      }); 
      context.Response = response; 
     } 
     else 
      base.OnException(context); 
    } 
} 
+0

什麼用'CreateODataErrorResponse'擴展方法,我們何時應該使用它嗎? – Rahul