在中间件- . net Core中获取端点HTTP谓词/命令属性



问题:给定一个。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]在所有的情况下?

我希望尽可能避免反射,因为我正在记录高噪声事件,不想妨碍我们的性能。

我可能会创建两个中间件。

  1. 错误中间件
  2. 日志中间件

无效请求将无法通过路由,在此之前您几乎无法知道端点定义。

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();
}

相关内容

  • 没有找到相关文章

最新更新