未在api请求上调用中间件类

本文关键字:中间件 调用 api 请求 未在 | 更新日期: 2023-09-27 18:12:54

我创建了一个基本的webAPI项目(选中webAPI的空白web项目(,并将owin-nuget包添加到该项目中。

  • Microsoft.AspNet.WebApi.Owin
  • Microsoft.Owin.Host.SystemWeb
  • Owin

然后我创建了一个Logging类,并通过启动将其连接起来

using AppFunc = System.Func<System.Collections.Generic.IDictionary<string, object>, System.Threading.Tasks.Task>;
public class Startup
{
    public void Configuration(IAppBuilder appBuilder)
    {
        Debug.WriteLine("Startup Called");
        var config = new HttpConfiguration();
        WebApiConfig.Register(config);
        appBuilder.UseWebApi(config);
        appBuilder.Use(typeof(LoggingMiddleware));
    }
}
public class LoggingMiddleware
{
    private AppFunc Next { get; set; }
    public LoggingMiddleware(AppFunc next)
    {
        Next = next;
    }
    public async Task Invoke(IDictionary<string, object> environment)
    {
        Debug.WriteLine("Begin Request");
        await Next.Invoke(environment);
        Debug.WriteLine("End Request");
    }
}

当我运行项目并打开默认页面时,我会看到Begin/End请求被调用(发生两次,不确定为什么(。

但是,如果我尝试调用/api路由(例如"/api/ping/"(,请求会成功完成,但我在日志中看不到Begin/End请求状态。

我错过了什么?

未在api请求上调用中间件类

Owin按照中间件项目的注册顺序执行中间件项目,以对控制器(appBuilder.UseWebApi(config)(的调用结束,而控制器似乎没有调用next.Invoke()。考虑到问题中的代码在UseWebApi调用之后注册了Logging Middleware类,这将导致它永远不会被API请求调用。

将代码更改为:

public class Startup
{
    public void Configuration(IAppBuilder appBuilder)
    {
        //.....
        //This must be registered first
        appBuilder.Use(typeof(LoggingMiddleware));
        //Register this last
        appBuilder.UseWebApi(config);
    }
}

解决了问题。