gpt4 book ai didi

asp.net-web-api - ASP.NET Core Web API : Catching Routing Errors

转载 作者:行者123 更新时间:2023-12-02 12:32:25 27 4
gpt4 key购买 nike

我正在 try catch ASP.NET Core Web API 项目中的路由错误。

具体来说,路由错误是指:在 Controller 中我只有:

// GET api/values/5
[HttpGet("{id}")]
public string Get(int id)
{
return "value";
}

但是请求是:

api/values/5/6

自动返回 404,但我希望能够在代码中处理这个问题(即调用某种异常处理例程)。

我尝试了三种不同的方法但没有成功:

在ConfigureServices(IServiceCollection服务)中,我添加了:

services.AddMvc(config =>
{
config.Filters.Add(typeof(CustomExceptionFilter));
});

这会捕获 Controller 内发生的错误(例如,如果我在上面的 Get(id) 方法中放置 throw() ),但不会捕获路由错误。我认为这是因为没有找到匹配的 Controller 方法,因此错误会沿着中间件管道传播。

为了尝试进一步处理管道中的错误,我尝试了...

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();

app.UseExceptionHandler(
options =>
{
options.Run(
async context =>
{
var ex = context.Features.Get<IExceptionHandlerFeature>();
// handle exception here
});
});

app.UseApplicationInsightsRequestTelemetry();
app.UseApplicationInsightsExceptionTelemetry();
app.UseMvc();
}

我也尝试过:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();

app.Use(async (ctx, next) =>
{
try
{
await next();
}
catch (Exception ex)
{
// handle exception here
}
});

app.UseApplicationInsightsRequestTelemetry();
app.UseApplicationInsightsExceptionTelemetry();
app.UseMvc();
}

当发生路由错误时,上述两项似乎都不会被调用。我采取了错误的方法吗?或者这些方法中的一种应该真正有效吗?

如有任何建议,我们将不胜感激。

谢谢

克里斯

PS。我对 ASP.NET Web API 比较陌生,所以请原谅我可能使用了稍微错误的术语。

最佳答案

您可以使用UseStatusCodePages扩展方法:

 app.UseStatusCodePages(new StatusCodePagesOptions()
{
HandleAsync = (ctx) =>
{
if (ctx.HttpContext.Response.StatusCode == 404)
{
//handle
}

return Task.FromResult(0);
}
});

编辑

 app.UseExceptionHandler(options =>
{
options.Run( async context =>
{
var ex = context.Features.Get<IExceptionHandlerFeature>();
// handle
await Task.FromResult(0);
});
});
app.UseStatusCodePages(new StatusCodePagesOptions()
{
HandleAsync = (ctx) =>
{
if (ctx.HttpContext.Response.StatusCode == 404)
{
// throw new YourException("<message>");
}

return Task.FromResult(0);
}
});

关于asp.net-web-api - ASP.NET Core Web API : Catching Routing Errors,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39700607/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com