如何捕获由于 ASP.NET 中无法识别的 URL 路径导致的错误?
How do I capture errors due to unrecognized URL path in ASP.NET?
我有一个 ASP.NET 服务,它已经有 config.Services.Replace(typeof(IExceptionHandler), new MyExceptionHandler());
在那里它跟踪特定的错误,所以没什么特别的。
我想更具体地说明如何跟踪无效 URL 的情况。
例如,如果我的服务有一个 controllers/methods 对应于请求 URL 中的各种 /api/controller/../method/..
路径,我想跟踪与任何 controller/method 都不匹配的请求特殊标志,以便轻松过滤它们 - 我不想看到所有随机 /bot/probing.php
和 hack/seeking.jsp
到 (1) 污染我的正常日志 (2) 丢失并且没有及时注意到。
理想情况下,如果可能的话,我还想切断连接而不用 HTTP 500 响应调用者
WebAPI OWIN 中间件无法处理的请求,将传递给 OWIN 管道中的下一个中间件。这意味着您可以在 WebAPI 中间件之后添加自定义中间件来处理不匹配任何 controller/action 对的请求。
此外,如果您所有的 REST API 端点都有一个基本路径 /api
,您可以将 WebAPI 和您的自定义中间件映射到这个基本路径,以排除对随机 URL 的请求(像 /bot/probing.php
) 来自 processing.
配置上述管道的 OWIN 启动 class 可以是以下内容:
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.Map(
"/api",
apiApp =>
{
var config = new HttpConfiguration();
WebApiConfig.Register(config);
app
.UseWebApi(config)
.Use(async (ctx, next) =>
{
Trace.TraceError(
"WebApi routing error: {0}{1}",
ctx.Request.PathBase,
ctx.Request.Path);
await next();
});
});
}
}
我有一个 ASP.NET 服务,它已经有 config.Services.Replace(typeof(IExceptionHandler), new MyExceptionHandler());
在那里它跟踪特定的错误,所以没什么特别的。
我想更具体地说明如何跟踪无效 URL 的情况。
例如,如果我的服务有一个 controllers/methods 对应于请求 URL 中的各种 /api/controller/../method/..
路径,我想跟踪与任何 controller/method 都不匹配的请求特殊标志,以便轻松过滤它们 - 我不想看到所有随机 /bot/probing.php
和 hack/seeking.jsp
到 (1) 污染我的正常日志 (2) 丢失并且没有及时注意到。
理想情况下,如果可能的话,我还想切断连接而不用 HTTP 500 响应调用者
WebAPI OWIN 中间件无法处理的请求,将传递给 OWIN 管道中的下一个中间件。这意味着您可以在 WebAPI 中间件之后添加自定义中间件来处理不匹配任何 controller/action 对的请求。
此外,如果您所有的 REST API 端点都有一个基本路径 /api
,您可以将 WebAPI 和您的自定义中间件映射到这个基本路径,以排除对随机 URL 的请求(像 /bot/probing.php
) 来自 processing.
配置上述管道的 OWIN 启动 class 可以是以下内容:
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.Map(
"/api",
apiApp =>
{
var config = new HttpConfiguration();
WebApiConfig.Register(config);
app
.UseWebApi(config)
.Use(async (ctx, next) =>
{
Trace.TraceError(
"WebApi routing error: {0}{1}",
ctx.Request.PathBase,
ctx.Request.Path);
await next();
});
});
}
}