2016-06-13 10 views
56

Zurück in RC1, ich würde das tun:Wie HTTP 500 von ASP.NET Core RC2 Web API zurückgeben?

[HttpPost] 
    public IActionResult Post([FromBody]string something) 
    {  
     ... 
     try{ 
     } 
     catch(Exception e) 
     { 
      return new HttpStatusCodeResult((int)HttpStatusCode.InternalServerError); 
     } 
    } 

In RC2 gibt es nicht mehr HttpStatusCodeResult, und es gibt nichts, was ich finden kann, dass ich eine 500 Art von IActionResult läßt zurückzukehren.

Ist der Ansatz jetzt völlig anders für das, was ich frage? Versuchen wir nicht mehr in Controller Code zu fangen? Lassen wir das Framework einfach eine generische 500-Ausnahme an den API-Aufrufer zurückgeben? Wie kann ich den genauen Ausnahme-Stack für die Entwicklung sehen?

Antwort

70

Von dem, was ich sehen kann, gibt es Hilfsmethoden innerhalb der ControllerBase Klasse. Verwenden Sie einfach die StatusCode Methode:

[HttpPost] 
public IActionResult Post([FromBody] string something) 
{  
    //... 
    try { 
     DoSomething(); 
    } 
    catch(Exception e) 
    { 
     LogException(e); 
     return StatusCode(500); 
    } 
} 

Sie auch die StatusCode(int statusCode, object value) Überlastung verwenden kann, die auch den Inhalt verhandelt.

2

Sie können eine BadRequestResult zurückgeben oder eine StatusCodeResult, das heißt:

return new BadRequestResult(); 

oder

return new StatusCodeResult(500) 
+24

Schlechte Anfrage ist http-Code 400 und ein Signal, dass der Client ungültige Anfrage/Daten (d. H. Gescheiterte Modellvalidierung) gesendet hat. http-Code 500 ist für interne Serverfehler, nicht genau das gleiche;) – Tseng

+0

ah, danke! Ich war nicht wirklich sicher, worum es bei BadRequest ging, das macht Sinn –

35

Sie Microsoft.AspNetCore.Mvc.ControllerBase.StatusCode verwenden könnte und Microsoft.AspNetCore.Http.StatusCodes Ihre Antwort zu bilden, wenn Sie möchten, bestimmte nicht hart codieren Zahlen.

return StatusCode(StatusCodes.Status500InternalServerError); 
+2

Tolles, vermeidet alle hartcodierten Teile/"magische Zahlen".Ich habe vorher StatusCode ((int) HttpStatusCode.InternalServerError) verwendet, aber ich mag Ihre besser. – aleor

+1

Eine Sache, die ich zu der Zeit nicht in Betracht gezogen habe, ist, dass sie den Code lesbarer macht. Wenn Sie darauf zurückkommen, wissen Sie, um welche Fehlernummer es sich handelt, es ist genau dort im Code. Selbstdokumentieren :-) –

+2

Ich kann mir nicht vorstellen, dass sich der interne Serverfehler (500) in absehbarer Zeit ändert. – rolls

1
return StatusCode((int)HttpStatusCode.InternalServerError, e); 

verwendet werden.

HttpStatusCode ist eine Aufzählung in System.Net.

3

Ein besserer Weg, dies ab sofort zu behandeln (1.1) ist dies in Startup.cs ‚s zu tun Configure():

app.UseExceptionHandler("/Error"); 

Dies wird den Weg für /Error auszuführen. Dies erspart Ihnen das Hinzufügen von try-catch-Blöcken zu jeder Aktion, die Sie schreiben.

Natürlich müssen Sie eine Errorcontroller diesem ähnlich ist hinzuzufügen:

[Route("[controller]")] 
public class ErrorController : Controller 
{ 
    [Route("")] 
    [AllowAnonymous] 
    public IActionResult Get() 
    { 
     return StatusCode(StatusCodes.Status500InternalServerError); 
    } 
} 

Weitere Informationen here.


Falls Sie die aktuellen Ausnahmedaten erhalten möchten, können Sie dies auf die oben Get() direkt vor der return Anweisung hinzufügen.

// Get the details of the exception that occurred 
var exceptionFeature = HttpContext.Features.Get<IExceptionHandlerPathFeature>(); 

if (exceptionFeature != null) 
{ 
    // Get which route the exception occurred at 
    string routeWhereExceptionOccurred = exceptionFeature.Path; 

    // Get the exception that occurred 
    Exception exceptionThatOccurred = exceptionFeature.Error; 

    // TODO: Do something with the exception 
    // Log it with Serilog? 
    // Send an e-mail, text, fax, or carrier pidgeon? Maybe all of the above? 
    // Whatever you do, be careful to catch any exceptions, otherwise you'll end up with a blank page and throwing a 500 
} 

Oberhalb Schnipsel von Scott Sauber's blog übernommen.

+0

Das ist großartig, aber wie kann ich die ausgelöste Ausnahme protokollieren? – redwards510

+0

@ redwards510 So geht's: https://scottsauber.com/2017/04/03/adding-global-error-handling-and-logging-in-asp-net-core/ Ich werde meine Antwort aktualisieren Reflektieren Sie es, da es sich um einen sehr häufigen Anwendungsfall handelt. – gldraphael

-2
return StatusCodes.Status500InternalServerError; 
+2

Sie können die Enumeration nicht zurückgeben, sie muss in die StatusCode-Methode eingeschlossen werden - wie andere bereits Monate zuvor veröffentlicht haben. – McGuireV10

Verwandte Themen