在RC1中,我会这样做:

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

在RC2中,不再有HttpStatusCodeResult,也没有什么我可以找到,让我返回一个500类型的IActionResult。

现在的方法与我要求的完全不同吗?我们在控制器代码中不再尝试捕获了吗?我们只是让框架向API调用者抛出一个通用的500异常吗?对于开发,我如何才能看到确切的异常堆栈?


当前回答

如果你不希望硬编码特定的数字,你可以使用Microsoft.AspNetCore.Mvc.ControllerBase.StatusCode和microsoft . aspnetcore . http . statuscode来形成你的响应。

return  StatusCode(StatusCodes.Status500InternalServerError);

更新:2019年8月

也许与最初的问题没有直接关系,但当试图用Microsoft Azure函数实现相同的结果时,我发现我必须在Microsoft. aspnetcore . mvc . core程序集中构造一个新的StatusCodeResult对象。我的代码现在是这样的;

return new StatusCodeResult(StatusCodes.Status500InternalServerError);

其他回答

对于aspnetcore-3.1,你也可以像下面这样使用Problem();

https://learn.microsoft.com/en-us/aspnet/core/web-api/handle-errors?view=aspnetcore-3.1

 [Route("/error-local-development")]
public IActionResult ErrorLocalDevelopment(
    [FromServices] IWebHostEnvironment webHostEnvironment)
{
    if (webHostEnvironment.EnvironmentName != "Development")
    {
        throw new InvalidOperationException(
            "This shouldn't be invoked in non-development environments.");
    }

    var context = HttpContext.Features.Get<IExceptionHandlerFeature>();

    return Problem(
        detail: context.Error.StackTrace,
        title: context.Error.Message);
}

目前(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的博客。

如果你不希望硬编码特定的数字,你可以使用Microsoft.AspNetCore.Mvc.ControllerBase.StatusCode和microsoft . aspnetcore . http . statuscode来形成你的响应。

return  StatusCode(StatusCodes.Status500InternalServerError);

更新:2019年8月

也许与最初的问题没有直接关系,但当试图用Microsoft Azure函数实现相同的结果时,我发现我必须在Microsoft. aspnetcore . mvc . core程序集中构造一个新的StatusCodeResult对象。我的代码现在是这样的;

return new StatusCodeResult(StatusCodes.Status500InternalServerError);

从我所看到的ControllerBase类中有helper方法。只需使用StatusCode方法:

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

你也可以使用StatusCode重载(int StatusCode, object value)来协商内容。

如果你需要一个人来回应,你可以打电话

return StatusCode(StatusCodes.Status500InternalServerError, responseObject);

这将返回一个500和响应对象…