如何从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.StatusCode
和Microsoft.AspNetCore.Http.StatusCodes
来形成你的回应,如果你不想硬编码特定的数字。
return StatusCode(StatusCodes.Status500InternalServerError);
现在(1.1)处理这个问题的一个更好的方法是在Startup.cs
的Configure()
做到这一点:
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);
应该使用。
HttpStatusCode
是System.Net
的枚举。
return StatusCodes.Status500InternalServerError;
- 如何在ConfigureServices中获得开发/暂存/生产托pipe环境
- Visual Studio 2017安装打破了Visual Studio 2015 ASP.NET核心项目
- 我如何让红帽网页服务器收听非本地主机的请求?
- 什么是Kestrel(vs IIS / Express)
- 如何获得ASP.NET核心中的HttpContext.Current?
- 找不到与命令“dotnet-aspnet-codegenerator”匹配的可执行文件
- 新的netstandardapp和netcoreapp TFM之间有什么区别?
- 为什么要在内置的ASP.NET Core DI容器上使用第三方DI容器?
- 如何编译保存在Visual Studio 2015中的.less文件(预览)