2012-10-22 15 views
8

Gibt es eine Möglichkeit Web Api Standardverhalten für Fehlermeldungen zu ändern, wie zum Beispiel:asp.net Web Api - Standard-Fehlermeldungen

GET /trips/abc 

Reagiert mit (paraphrasiert):

HTTP 500 Bad Request 

{ 
    "Message": "The request is invalid.", 
    "MessageDetail": "The parameters dictionary contains a null entry for parameter 'tripId' of non-nullable type 'System.Guid' for method 'System.Net.Http.HttpResponseMessage GetTrip(System.Guid)' in 'Controllers.TripController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter." 
} 

I Ich möchte vermeiden, diese ziemlich detaillierten Informationen über meinen Code herauszugeben, und ersetze sie stattdessen durch etwas wie:

könnte ich das im UserController machen, aber die Codeausführung geht noch nicht einmal so weit.

edit:

ich einen Weg zur Beseitigung detaillierte Fehlermeldungen aus dem Ausgang gefunden haben, in Global.asax.cs diese Codezeile verwenden:

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = 
IncludeErrorDetailPolicy.LocalOnly; 

Dieses wie diese eine Nachricht erzeugt :

{ 
    "Message": "The request is invalid." 
} 

, die besser, aber nicht genau das, was ich will - Wir haben eine Reihe von numerischen Fehlercodes angegeben, die detaillierten Fehlermeldungen clientseitige abgebildet werden. Ich möchte nur dann ausgegeben, den entsprechenden Fehlercode (das ich in der Lage bin zu Ausgang vor zu wählen, vorzugsweise durch Sehen, welche Art von Ausnahme aufgetreten), zum Beispiel:

{ error: true, error_code: 51 } 

Antwort

7

Sie möchten vielleicht die Form halten die Daten als Typ HttpError, auch wenn Sie detaillierte Informationen über die tatsächliche Ausnahme ausblenden möchten. Um dies zu tun, können Sie einen benutzerdefinierten DelegatingHandler hinzufügen, um den HttpError zu ändern, den Ihr Dienst auslöst.

Hier ist ein Beispiel dafür, wie die DelegatingHandler aussehen könnte:

public class CustomModifyingErrorMessageDelegatingHandler : DelegatingHandler 
{ 
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     return base.SendAsync(request, cancellationToken).ContinueWith<HttpResponseMessage>((responseToCompleteTask) => 
     { 
      HttpResponseMessage response = responseToCompleteTask.Result; 

      HttpError error = null; 
      if (response.TryGetContentValue<HttpError>(out error)) 
      { 
       error.Message = "Your Customized Error Message"; 
       // etc... 
      } 

      return response; 
     }); 
    } 
} 
+0

Perfect, Thanks! – doque

+3

Falls Sie sich fragen, wo Sie es hinzufügen können, können Sie es hinzufügen, indem Sie 'config.MessageHandlers.Add (new YourDelegatingHandler())' üblicherweise in der 'Register (HttpConfiguration config)' Methode in Ihrer Startlogik aufrufen. –

+0

Anstatt den Antwortinhalt nach der Erstellung zu ersetzen, sollten wir nicht eher die Klasse/den Dienst anpassen, der für die Erstellung dieser Antwort verantwortlich ist? – dgaspar

2

Maggies Antwort als auch für mich gearbeitet. Danke fürs Schreiben!

Ich wollte nur ein paar Bits zu ihrem Code für zusätzliche Klarstellung:

HttpResponseMessage response = responseToCompleteTask.Result; 
HttpError error = null; 

if ((!response.IsSuccessStatusCode) && (response.TryGetContentValue(out error))) 
{ 
    // Build new custom from underlying HttpError object. 
    var errorResp = new MyErrorResponse(); 

    // Replace outgoing response's content with our custom response 
    // while keeping the requested MediaType [formatter]. 
    var content = (ObjectContent)response.Content; 
    response.Content = new ObjectContent(typeof (MyErrorResponse), errorResp, content.Formatter); 
} 

return response; 

Wo:

public class MyErrorResponse 
    { 
     public MyErrorResponse() 
     { 
      Error = true; 
      Code = 0; 
     } 

     public bool Error { get; set; } 
     public int Code { get; set; } 
    }