在RC1中,我会这样做:
[HttpPost]
public IActionResult Post([FromBody]string something)
{
try{
// ...
}
catch(Exception e)
{
return new HttpStatusCodeResult((int)HttpStatusCode.InternalServerError);
}
}
在RC2中,不再有HttpStatusCodeResult,也没有什么我可以找到,让我返回一个500类型的IActionResult。
现在的方法与我要求的完全不同吗?我们在控制器代码中不再尝试捕获了吗?我们只是让框架向API调用者抛出一个通用的500异常吗?对于开发,我如何才能看到确切的异常堆栈?
目前(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);
}
}
更多信息请点击这里。
如果您想要获得实际的异常数据,可以在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的博客。
对于API响应(使用net core),我已经尝试过了,似乎工作得很好:
var err = Content(JsonConvert.SerializeObject(response, SerializerSettings), "application/x-javascript", contentEncoding: System.Text.Encoding.UTF8);
err.StatusCode = StatusCodes.Status500InternalServerError;
return err;
您只需要首先创建一个响应对象,然后响应这个。这样做,我们可以保留内容类型、编码,并添加状态代码。
只是添加这个供将来参考,谁是卡在以及想要一个快速和简单的方法来做到这一点。