C# 未调用ErrorController

C# 未调用ErrorController,c#,asp.net-core,C#,Asp.net Core,我试图自定义默认行为,以便在API控制器出现异常时更改返回的内容 我应用了我在文档中读到的内容: Startup.cs: public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseSwagger(); app.U

我试图自定义默认行为,以便在API控制器出现异常时更改返回的内容

我应用了我在文档中读到的内容:

Startup.cs:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseSwagger();
        app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "todo_list_app v1"));
    }
    else
    {
        app.UseExceptionHandler("/error");
    }
    [...]
}
[ApiController]
public class ErrorController : ControllerBase
{
    [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);
        }

    [Route("/error")]
    public IActionResult Error() => Problem();
}
ErrorController.cs:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseSwagger();
        app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "todo_list_app v1"));
    }
    else
    {
        app.UseExceptionHandler("/error");
    }
    [...]
}
[ApiController]
public class ErrorController : ControllerBase
{
    [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);
        }

    [Route("/error")]
    public IActionResult Error() => Problem();
}
[ApiController]
公共类错误控制器:ControllerBase
{
[路线(“/error local development”)]
公共IActionResult ErrorLocalDevelopment(
[FromServices]IWebHostenEnvironment网站托管环境)
{
如果(webHostEnvironment.EnvironmentName!=“开发”)
{
抛出新的InvalidOperationException(
“这不应该在非开发环境中调用。”);
}
var context=HttpContext.Features.Get();
返回问题(详细信息:context.Error.StackTrace,标题:context.Error.Message);
}
[路由(“/错误”)]
公共IActionResult错误()=>问题();
}

为了实现我想要实现的目标,我还必须在开发模式中调用UseExceptionHandler

//app.UseDeveloperExceptionPage();
app.UseExceptionHandler("/error-local-development");
然而,在发布模式中,我没有预料到这一点

 public IActionResult Error() => Problem();

将只返回HTTP代码。这与完全没有路由时没有区别。

您的
应用程序。UseExceptionHandler(“/error”)
表示未处理的异常将被
ErrorController
捕获。在
[Route(“/error”)]
中不需要
/
,它应该是
[Route(“error”)]

我建议您在这里实现一个主体,以实际捕获您的异常,并对它们执行任何您想要的操作。看看我写的一个非常基本的例子:

[Route("error")]
public ErrorResponseModel Error()
{
    var context = HttpContext.Features.Get<IExceptionHandlerFeature>();
    var exception = context.Error;

    Response.StatusCode = (int)HttpStatusCode.InternalServerError;

    return new ErrorResponseModel(exception);
}
[路由(“错误”)]
公共ErrorResponseModel错误()
{
var context=HttpContext.Features.Get();
var exception=context.Error;
Response.StatusCode=(int)HttpStatusCode.InternalServerError;
返回新的ErrorResponseModel(异常);
}

这将捕获您的异常,然后向其附加
500
错误。我在这里使用自定义模型,但您可以返回任何您想要的。您还可以进一步扩展此功能,检查您的异常类型,并根据您的异常类型返回不同的错误代码。

我不确定您是否愿意使用一些自定义异常处理程序,您可以在此处查看示例:外观良好,但我想理解为什么原始版本在我的情况下不起作用。您是否在本地运行您的开发环境?我在本地运行,但我构建了发行版,并通过重命名数据库中的表故意导致异常。如果您尝试直接访问
/error