如何从ASP.NET Core RC2 Web Api返回HTTP 500?

回到RC1,我会这样做:

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

在RC2中,不再有HttpStatusCodeResult,也没有什么我能find的,让我返回一个500types的IActionResult。

现在的方法与我所要求的完全不同吗? 我们不再试图捕捉Controller代码? 我们只是让框架抛出一个通用的500exception回API调用者? 对于开发,我怎么能看到确切的exception栈?

从我可以看到有ControllerBase类中的辅助方法。 只需使用StatusCode方法:

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

您也可以使用同时协商内容的StatusCode(int statusCode, object value)重载。

你可以使用Microsoft.AspNetCore.Mvc.ControllerBase.StatusCodeMicrosoft.AspNetCore.Http.StatusCodes来形成你的回应,如果你不想硬编码特定的数字。

 return StatusCode(StatusCodes.Status500InternalServerError); 

现在(1.1)处理这个问题的一个更好的方法是在Startup.csConfigure()做到这一点:

 app.UseExceptionHandler("/Error"); 

这将执行/Error的路由。 这样可以避免将try-catch块添加到您编写的每个操作中。

当然,你需要添加一个类似这样的ErrorController:

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

更多信息在这里 。


如果你想获得实际的exception数据,你可以在return语句之前将它添加到上面的Get()

 // 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的博客 。

您可以返回一个BadRequestResult或一个StatusCodeResult,即:

 return new BadRequestResult(); 

要么

 return new StatusCodeResult(500) 
 return StatusCode((int)HttpStatusCode.InternalServerError, e); 

应该使用。

HttpStatusCodeSystem.Net的枚举。

 return StatusCodes.Status500InternalServerError;