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

C# 未在api请求上调用中间件类,c#,asp.net-web-api2,owin,C#,Asp.net Web Api2,Owin,我创建了一个基本的webAPI项目(选中webAPI的空白web项目),并将owin nuget包添加到该项目中 Microsoft.AspNet.WebApi.Owin Microsoft.Owin.Host.SystemWeb 奥温 然后我创建了一个日志类,并通过startup将其连接起来 using AppFunc = System.Func<System.Collections.Generic.IDictionary<string, object>, System.

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

  • Microsoft.AspNet.WebApi.Owin
  • Microsoft.Owin.Host.SystemWeb
  • 奥温
然后我创建了一个日志类,并通过startup将其连接起来

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");
    }
}
使用AppFunc=System.Func;
公营创业
{
公共无效配置(IAppBuilder appBuilder)
{
Debug.WriteLine(“启动调用”);
var config=新的HttpConfiguration();
WebApiConfig.Register(配置);
appBuilder.UseWebApi(配置);
appBuilder.Use(typeof(logging中间件));
}
}
公共类日志中间件
{
私有AppFunc Next{get;set;}
公共日志中间件(AppFunc next)
{
下一个=下一个;
}
公共异步任务调用(IDictionary环境)
{
Debug.WriteLine(“开始请求”);
等待下一步。调用(环境);
Debug.WriteLine(“结束请求”);
}
}
当我运行项目时,默认页面打开,我看到开始/结束请求被调用(发生两次,不知道为什么)

但是,如果我尝试调用
/api
路由(例如“/api/ping/”),请求将成功完成,但在日志中看不到开始/结束请求状态


我缺少什么?

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

解决问题。

已保存日期!!:D> 它似乎不调用next.Invoke()uhhh为什么不呢??来吧,微软。。。