api 请求未调用中间件 class

Middleware class not called on api requests

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

然后我创建了一个日志记录 class,并通过启动将其连接起来

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 请求状态在日志中。

我错过了什么?

Owin 按照注册的顺序执行中间件项,在调用控制器 (appBuilder.UseWebApi(config)) 时结束,而控制器 (appBuilder.UseWebApi(config)) 似乎并未调用 next.Invoke()。鉴于问题中的代码在 UseWebApi 调用后 注册了日志记录中间件 class,这导致它永远不会为 API 请求调用.

将代码更改为:

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

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

        //Register this last
        appBuilder.UseWebApi(config);
    }
}

问题已解决。