api 请求未调用中间件 class
Middleware class not called on api requests
我创建了一个基本的 webAPI 项目(选中 webAPI 的空白 web 项目)并将 owin nuget 包添加到项目中。
- Microsoft.AspNet.WebApi.Owin
- Microsoft.Owin.Host.SystemWeb
- 欧文
然后我创建了一个日志记录 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);
}
}
问题已解决。
我创建了一个基本的 webAPI 项目(选中 webAPI 的空白 web 项目)并将 owin nuget 包添加到项目中。
- Microsoft.AspNet.WebApi.Owin
- Microsoft.Owin.Host.SystemWeb
- 欧文
然后我创建了一个日志记录 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);
}
}
问题已解决。