2016-08-08 48 views
1

drucke ich das .NET Muster bin mit dem mein Controller-Aktion eine Signatur als solcheÄndern .NET ApiController „BadResult()“ custom JSON

public async Task<IHttpActionResult> GetTimeSeries(string deviceId, string tag) { ... } 

und in der Steuerung hat Ich möchte einen benutzerdefinierten Fehler senden Ihre Mitteilung an den JSON API Spec

Ankleben Mein Ziel ist, wenn ein Fehler stoßen

return BadRequest(someJSONErrorObject); 

oder

012 zu verwenden,
return NotFound(someJSONErrorObject); 

anstatt eine Ausnahme zu werfen.

Derzeit wenn ich

return BadRequest(JsonConvert.SerializeObject(someJSONErrorObject)); 

tun das JSON ich zurück sieht aus wie

{ 
"Message": "{\"data\":null,\"errors\":[{\"detail\":\"The string was not recognized as a valid DateTime. There is an unknown word starting at index 0.\"}],\"meta\":null}" 
} 

Antwort

2

Erstellen eines benutzerdefinierten IHttpActionResult

public class CustomResponseResult<T> : IHttpActionResult { 

    public CustomResponseResult(HttpStatusCode statusCode, T content, HttpRequestMessage request) { 
     Content = content; 
     Request = request; 
     StatusCode = statusCode; 
    } 

    public T Content { get; private set; } 
    public HttpRequestMessage Request { get; private set; } 
    public HttpStatusCode StatusCode { get; private set; } 

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) { 
     return Task.FromResult(Execute()); 
    } 

    private HttpResponseMessage Execute() { 
     var response = Request.CreateResponse(StatusCode, Content); 
     response.RequestMessage = Request; 
     response.ReasonPhrase = StatusCode.ToString(); 
     return response; 
    } 
} 

und dann um

erlaubt zu halten
return this.BadRequest(someJSONErrorObject); 

oder

Usability schaffen Methoden Erweiterung

public static class ApiControllerExtensions { 
    public static IHttpActionResult BadRequest<T>(this ApiController controller, T content) { 
     return controller.CustomResponse(HttpStatusCode.BadRequest, content); 
    } 

    public static IHttpActionResult NotFound<T>(this ApiController controller, T content) { 
     return controller.CustomResponse(HttpStatusCode.NotFound, content); 
    } 

    public static IHttpActionResult CustomResponse<T>(this ApiController controller, HttpStatusCode statusCode, T content) { 
     var request = controller.Request; 
     var result = new CustomResponseResult<T>(statusCode, content, request); 
     return result; 
    } 
} 

, dass die Anrufe wollten

return this.NotFound(someJSONErrorObject); 
+0

nicht ausgeführt. Dies funktioniert für den' OK (someJSONDataObject) ', aber' BadRequest() '-Konstruktor nimmt nur eine Zeichenfolge oder einen Zustand. Was in der Zeichenfolge enthalten ist, wird der Eigenschaft "Message" zugewiesen. – leejt489

+0

Ok, ich habe das in meinem Code verstanden. Lassen Sie eine schnelle Überprüfung – Nkosi

+0

@ leejt489 überprüfen Update – Nkosi

0

benutzerdefinierte Fehlerklasse erstellen, wo Sie den HTTP-Status und Fehlermeldung einstellen. Erstellen Sie eine benutzerdefinierte Ausnahmeklasse, um Ihre custome error messag zu werfen. Erstellen Sie einen globalen Ausnahmefilter, der Ihnen eine benutzerdefinierte Ausnahme im JSON-Format sendet.

+0

Mein Ziel war nicht, eine Ausnahme in den Controller zu werfen, sondern 'BadRequest()' explizit zurückzugeben. Wenn Sie 'BadRequest() 'zurückgeben, wird der Ausnahmefilter – leejt489