ASP.NET Core Web API:捕获路由错误
ASP.NET Core Web API: Catching Routing Errors
我正在尝试捕获 ASP.NET Core Web API 项目中的路由错误。
具体来说,路由错误,我的意思是例如:
在控制器中我只有:
// GET api/values/5
[HttpGet("{id}")]
public string Get(int id)
{
return "value";
}
但是一个请求是:
api/values/5/6
自动返回 404,但我希望能够在代码中处理它(即调用某种异常处理例程)。
我尝试了三种不同的方法都没有成功:
在 ConfigureServices(IServiceCollection services) 中,我添加了:
services.AddMvc(config =>
{
config.Filters.Add(typeof(CustomExceptionFilter));
});
这会捕获控制器内发生的错误(例如,如果我在上面的 Get(id) 方法中放置一个 throw()),但不会捕获路由错误。我假设这是因为没有找到匹配的控制器方法,所以错误会向上传播到中间件管道。
为了进一步处理错误,我尝试了...
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 Core Web API 项目中的路由错误。
具体来说,路由错误,我的意思是例如: 在控制器中我只有:
// GET api/values/5
[HttpGet("{id}")]
public string Get(int id)
{
return "value";
}
但是一个请求是:
api/values/5/6
自动返回 404,但我希望能够在代码中处理它(即调用某种异常处理例程)。
我尝试了三种不同的方法都没有成功:
在 ConfigureServices(IServiceCollection services) 中,我添加了:
services.AddMvc(config =>
{
config.Filters.Add(typeof(CustomExceptionFilter));
});
这会捕获控制器内发生的错误(例如,如果我在上面的 Get(id) 方法中放置一个 throw()),但不会捕获路由错误。我假设这是因为没有找到匹配的控制器方法,所以错误会向上传播到中间件管道。
为了进一步处理错误,我尝试了...
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);
}
});