未在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请求状态。
我错过了什么?
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);
}
}
解决了问题。