问题:给定一个。net Core web API端点,看起来像这样:
[HttpPost]
public async Task<ActionResult> MyEndpoint () { }
当发出请求时,我希望能够知道在所有情况下,在中间件层中,端点被定义为[HttpPost]
。
整个问题:
我想为每个端点添加全局错误日志记录。所以我决定添加一些自定义中间件。
public void Configure (IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseRouting();
app.UseMyCustomLoggingMiddleware(); // my custom middleware
app.UseCors();
app.UseAuthentication();
app.UseEndpoints();
}
在我的自定义中间件中,在成功的情况下我可以使用Endpoint
类轻松检查端点谓词/属性。
public async Task InvokeAsync (HttpContext context)
{
Endpoint endpoint = context.GetEndpoint();
// endpoint.Metadata has the information i need! it knows it's a POST!
}
但是错误情况是我一直纠结的问题。上面的MyEndpoint
定义为[POST]端点,所以如果有人试图做一个[GET]请求时,我希望能够记录那个错误。其他不匹配的HTTP命令也一样。
在错误情况中,我们将应用程序配置为app.UseRouting()
。,当我们使用不正确的HTTP命令时,对Endpoint endpoint = context.GetEndpoint()
的调用停止返回实际的Endpoint
,我们可以访问元数据/谓词(可能是因为它无法找到它,因为不匹配的HTTP谓词命令),而是返回一个空的Endpoint
对象设置为{405 HTTP Method Not Supported}
。
如果我在调用app.UseRouting()
之前注册我的自定义中间件,试图获得默认路由到而不是自动返回405
,那么Endpoint endpoint = context.GetEndpoint()
调用只是返回null
,这也是不好的。
我怎么能得到的事实,目标端点被定义为[HttpPost]在所有的情况下?
我希望尽可能避免反射,因为我正在记录高噪声事件,不想妨碍我们的性能。
我可能会创建两个中间件。
- 错误中间件
- 日志中间件
无效请求将无法通过路由,在此之前您几乎无法知道端点定义。
public void Configure (IApplicationBuilder app, IWebHostEnvironment env)
{
// here you can handle the errors raised in the routing
app.UseMyCustomErrorMiddleware();
app.UseRouting();
// log valid requests here
app.UseMyCustomLoggingMiddleware();
app.UseCors();
app.UseAuthentication();
app.UseEndpoints();
}