2013-10-15 106 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