中间件类没有调用api请求

Obs*_*nix 8 c# owin asp.net-web-api2

我创建了一个基本的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");
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行项目并打开默认页面时,我看到调用了Begin/End请求(两次,因为它发生了,不知道为什么会这样).

但是,如果我尝试调用/api路由(例如`/ api/ping /'),请求成功完成,但我没有在日志中看到Begin/End请求状态.

我错过了什么?

Obs*_*nix 17

Owin按照它们注册的顺序执行中间件项目,结束于对appBuilder.UseWebApi(config)看起来没有调用的控制器()的调用next.Invoke().鉴于在该问题的代码已经注册记录中间件类UseWebApi通话,这使得它永远不会被调用API请求.

将代码更改为:

public class Startup
{
    public void Configuration(IAppBuilder appBuilder)
    {
        //.....

        //This must be registered first
        appBuilder.Use(typeof(LoggingMiddleware));

        //Register this last
        appBuilder.UseWebApi(config);
    }
}
Run Code Online (Sandbox Code Playgroud)

解决了这个问题.