2013-10-15 7 views
6

Ich bin interessiert zu wissen, welche Best Practices befolgt werden, um Ausnahmen im ODataController auslösen.Fehlerbehandlung für ASP.NET Odata Web API

Wenn Sie eine Ausnahme in der Methode auslösen, wird sie standardmäßig in den Antwortcode 500 übersetzt, und der Inhalt enthält Details zum Fehler. Ich möchte den Antwortcode explizit angeben und 400 in Fällen ungültiger Schlüssel senden.

Zum Beispiel: Wenn die Eingabeanforderung einen ungültigen Schlüssel hat, möchte ich einen HttpResponseCode von 400 zurückgeben und der Inhalt sollte die Fehlerdetails haben, ähnlich wie eine Ausnahme auszulösen.

Vielen Dank für Ihre Eingaben

+0

Key nicht gefunden verwenden sollte ein 404 – qujck

Antwort

1

Verwenden HttpResponseException,
z.B. throw new HttpResponseException(HttpStatusCode.NotFound);.
Details können gefunden werden here.

13

OData (zumindest seit v3) verwendet specific json Fehler zu repräsentieren:

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

Microsoft .NET enthält Microsoft.Data.OData.ODataError und Microsoft.Data.OData.ODataInnerError Klassen OData Fehler auf einer Server-Seite zu bilden.

richtige OData Fehlerreaktion (HttpResponseMessage) zu bilden, dass die Fehlerdetails enthält Sie können:

1) Form und das Rück HttpResponseMessage in Aktion des Controllers System.Web.OData.Extensions.HttpRequestMessageExtensions.CreateErrorResponse Methode

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

2) werfen HttpResponseException mit der Verwendung gleiche Methode zum Erstellen von HttpResponseMessage

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

3) werfen benutzerdefinierte typisierte Ausnahme und wandeln es Web Api Aktionsfilter

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

erhöhen, was ist die Verwendung von 'CreateODataErrorResponse' Erweiterungsmethode und wann sollten wir sie nutzen? – Rahul