2016-06-13 4 views
56

Назад в RC1, я хотел бы сделать это:Как вернуть HTTP 500 из ASP.NET Core RC2 Web Api?

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

В RC2, там больше не является HttpStatusCodeResult, и нет ничего, что я могу найти, что позволяет мне вернуть 500 тип IActionResult.

Является ли подход совсем иным, чем я спрашиваю? Мы больше не пытаемся поймать код Controller? Разве мы просто разрешаем фреймворку исключать общее 500 исключений для вызывающего API? Для разработки, как я могу увидеть конкретный стек исключений?

ответ

70

Из того, что я вижу, есть вспомогательные методы внутри класса ControllerBase. Просто используйте StatusCode метод:

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

Вы также можете использовать StatusCode(int statusCode, object value) перегрузку, которая также ведет переговоры содержание.

2

вы можете вернуть BadRequestResult или StatusCodeResult, то есть:

return new BadRequestResult(); 

или

return new StatusCodeResult(500) 
+24

Плохой запрос - это http-код 400 и сигнал о том, что клиент отправил неверный запрос/данные (т. Е. Не удалось проверить модель). http-код 500 для внутренней ошибки сервера, не совсем то же самое;) – Tseng

+0

ах, спасибо! Я не был уверен, что такое BadRequest, это имеет смысл. –

35

Вы можете использовать Microsoft.AspNetCore.Mvc.ControllerBase.StatusCode и Microsoft.AspNetCore.Http.StatusCodes, чтобы сформировать свой ответ, если вы не хотите жёстко конкретных номера.

return StatusCode(StatusCodes.Status500InternalServerError); 
+2

Отличный, избегает любых жестко закодированных частей/«волшебных чисел».Я использовал StatusCode ((int) HttpStatusCode.InternalServerError) раньше, но мне нравится ваш лучше. – aleor

+1

Одна вещь, которую я не рассматривал в то время, это то, что она делает код более читаемым, возвращаясь к нему, вы знаете, к чему относится номер ошибки 500, это прямо там, в коде. Self documenting :-) –

+2

Я не могу представить, что внутренняя ошибка сервера (500) меняется в ближайшее время. – rolls

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

должны использоваться.

HttpStatusCode является перечислением в System.Net.

3

Лучший способ справиться с этим, как сейчас (1.1), чтобы сделать это в Startup.cs «s Configure():

app.UseExceptionHandler("/Error"); 

Это выполнит маршрут для /Error. Это избавит вас от добавления блоков try-catch для каждого действия, которое вы пишете.

Конечно, вам нужно добавить ErrorController похожее на это:

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

Больше информации here.


В случае, если вы хотите, чтобы получить фактические данные исключения, вы можете добавить это к выше Get() прямо перед 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 
} 

Выше фрагмента взято с Scott Sauber's blog.

+0

Это потрясающе, но как я могу записать исключение, которое было выбрано? – redwards510

+0

@ redwards510 Вот как вы это делаете: https://scottsauber.com/2017/04/03/adding-global-error-handling-and-logging-in-asp-net-core/ Я обновлю свой ответ на отразите это, так как это очень распространенный случай использования. – gldraphael

-2
return StatusCodes.Status500InternalServerError; 
+2

Вы не можете вернуть перечисление, его необходимо обернуть в метод StatusCode - как и другие, опубликованные несколькими месяцами ранее. – McGuireV10

Смежные вопросы