中间件类未在API请求中调用

13

我创建了一个基本的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");
    }
}
当我运行该项目并打开默认页面时,我看到开始/结束请求被调用(发生两次,不确定原因)。
然而,如果我尝试调用 /api 路由(例如`/api/ping/`),请求成功完成,但是在日志中我没有看到开始/结束请求的状态。
我错过了什么?
1个回答

23

Owin按照注册顺序执行中间件,最后在调用控制器(appBuilder.UseWebApi(config))处结束,并没有调用next.Invoke()。考虑到问题中的Logging Middleware类是在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);
    }
}

解决了这个问题。


救了一天!!:D - Rashmi Pandit
它似乎没有调用next.Invoke(),为什么不这样做呢?嗯,微软... - Crescent Fresh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接