Frage Wie gibt man HTTP 500 von ASP.NET Core RC2 Web API zurück?


Zurück in RC1 würde ich das tun:

[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 einen 500-Typ von IActionResult zurückgeben kann.

Ist der Ansatz jetzt völlig anders für das, was ich verlange? Versuchen wir nicht mehr, reinzukommen Controller Code? 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?


75
2018-06-13 15:17


Ursprung


Antworten:


Von dem, was ich sehen kann, gibt es Helfer Methoden in der ControllerBase Klasse. Benutze einfach die StatusCode Methode:

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

Sie können auch die StatusCode(int statusCode, object value) Überladung, die auch den Inhalt verhandelt.


110
2018-06-13 15:30



Du könntest benutzen Microsoft.AspNetCore.Mvc.ControllerBase.StatusCode und Microsoft.AspNetCore.Http.StatusCodes um Ihre Antwort zu formulieren, wenn Sie bestimmte Nummern nicht fest codieren möchten.

return  StatusCode(StatusCodes.Status500InternalServerError);

59
2017-10-21 10:51



Ein besserer Weg, dies ab sofort (1.1) zu handhaben, ist es, dies zu tun Startup.csist es Configure():

app.UseExceptionHandler("/Error");

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

Natürlich müssen Sie einen ErrorController ähnlich dem hinzufügen:

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

Mehr Informationen Hier.


Falls Sie die tatsächlichen Ausnahmedaten erhalten möchten, können Sie dies zu den obigen hinzufügen Get() direkt vor dem return Erklärung.

// 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
}

Über dem Schnipsel genommen von Scott Saubers Blog.


8
2017-07-12 22:16



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

Sollte benutzt werden.

HttpStatusCode ist eine Aufzählung in System.Net.


4
2017-07-05 01:50



Sie können ein BadRequestResult oder ein StatusCodeResult zurückgeben, dh:

return new BadRequestResult();

oder

return new StatusCodeResult(500)

2
2018-06-13 15:35



return StatusCodes.Status500InternalServerError;

-8
2017-10-31 22:51