2016-06-13 33 views
56

Back in RC1, farei questo:Come restituire HTTP 500 da ASP.NET Core RC2 Web Api?

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

In RC2, non c'è più HttpStatusCodeResult, e non c'è niente che posso trovare che mi permette di restituire un tipo di IActionResult 500.

L'approccio è ora completamente diverso per quello che sto chiedendo? Non proviamo più a catturare il codice Controller? Lasciamo che il framework restituisca un'eccezione generica 500 al chiamante API? Per lo sviluppo, come posso vedere lo stack esatto?

risposta

70

Da quello che posso vedere ci sono metodi di supporto all'interno della classe ControllerBase. Basta usare il metodo StatusCode:

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

È inoltre possibile utilizzare il StatusCode(int statusCode, object value) sovraccarico che negozia anche il contenuto.

2

si può restituire un BadRequestResult o uno StatusCodeResult, vale a dire:

return new BadRequestResult(); 

o

return new StatusCodeResult(500) 
+24

La richiesta errata è il codice http 400 e un segnale che il client ha inviato richieste/dati non validi (ovvero convalida del modello non riuscita). http il codice 500 è per errore interno del server, non esattamente lo stesso;) – Tseng

+0

ah, grazie! Non ero proprio sicuro di cosa fosse BadRequest, questo ha senso –

35

si potrebbe usare Microsoft.AspNetCore.Mvc.ControllerBase.StatusCode e Microsoft.AspNetCore.Http.StatusCodes per formare la vostra risposta, se non si desidera hardcode specifica numeri.

return StatusCode(StatusCodes.Status500InternalServerError); 
+2

Ottimo, evita parti codificate/"numeri magici".Ho usato StatusCode ((int) HttpStatusCode.InternalServerError) prima, ma mi piace il tuo migliore. – aleor

+1

Una cosa che non ho considerato al momento è che rende il codice più leggibile, tornando ad esso si sa a cosa si riferisce l'errore numero 500, è proprio lì nel codice. Autodocumentazione :-) –

+2

Non riesco a immaginare l'errore del server interno (500) che cambia in qualsiasi momento presto. – rolls

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

dovrebbe essere usato.

HttpStatusCode è un elenco in System.Net.

3

Un modo migliore per gestire questo fin d'ora (1.1) è di fare questo in Startup.cs s' Configure():

app.UseExceptionHandler("/Error"); 

Questo eseguirà il percorso per /Error. Ciò ti eviterà di aggiungere blocchi try-catch ad ogni azione che scrivi.

Naturalmente, sarà necessario aggiungere un ErrorController simile a questo:

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

Maggiori informazioni here.


Nel caso in cui si desidera ottenere i dati di eccezione effettivo, è possibile aggiungere questo al di sopra Get() destra prima dell'istruzione return.

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

Frammento di cui sopra preso da Scott Sauber's blog.

+0

questo è fantastico, ma come posso registrare l'eccezione che è stata generata? – redwards510

+0

@ redwards510 Ecco come lo fai: https://scottsauber.com/2017/04/03/adding-global-error-handling-and-logging-in-asp-net-core/ Aggiornerò la mia risposta a rifletterlo, poiché è un caso d'uso molto comune – gldraphael

-2
return StatusCodes.Status500InternalServerError; 
+2

Non è possibile restituire l'enumerazione, è necessario che sia racchiuso nel metodo StatusCode, come altri hanno pubblicato mesi prima. – McGuireV10

Problemi correlati