2016-11-22 2 views
0

Ich versuche, das Vorhandensein von Details in Fehlerantworten von einem Web API 2 OData v4-Dienst zu steuern. Als ich das OData-Dienst auf meinem lokalen IIS gehostet treffen, bekomme ich so etwas wie dieses:So steuern Sie das Vorhandensein von OData-Fehlerdetails

{ 
    "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" 
    } 
    } 
} 

Wenn ich den gleichen Service in Anspruch nehmen und stellen Sie es auf einem Remote-Server, und schlug ihn mit der gleichen Nachricht, bekomme ich diese :

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

ich vermute, dass die „innererror“ und „Details“ Abschnitte unterdrückt werden, weil ich den Dienst der Ferne ruft mich? Ich bin froh, dass der Bereich "Innererror" unterdrückt wird - ich möchte diese Details nicht verlieren -, aber ich möchte den Abschnitt "Details" offen legen, damit ich mehr Feedback zu bestimmten Fehlern geben kann. Gibt es einen einfachen Weg, dies zu erreichen?

Danke!

Antwort

2

Ich erstellte meine OData-Fehlerantworten mit Request.CreateErrorResponse (myHttpStatusCode, myODataError). Betrachtet man den Quellcode von System.Web.Http.OData.Extensions.HttpRequestMessageExtensions.CreateErrorResponse, scheint es, dass, wenn Request.ShouldIncludeErrorDetail den Wert false hat, der ODataError nur mit den Elementen "code" und "message" neu erstellt wird. Meine Lösung war eine weitere Überlastung/Erweiterung von CreateErrorResponse zu schaffen, die einen Parameter akzeptiert, ob steuert die Details Abschnitt enthalten sein sollten:

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 
      }); 
    } 
} 

Dies ermöglicht es dem „innererror“ Abschnitt unabhängig von der „Details“ Abschnitt unterdrückt werden.

Verwandte Themen