如何删除OWIN中的中间件
本文关键字:OWIN 中间件 删除 何删除 | 更新日期: 2024-10-21 23:42:21
我已经在Configuration
方法中注册了一个OWIN中间件。然后我如何更改并删除中间件。
特别是,我想在一些文件更改后修改(删除/添加)StaticFiles中间件(我想通过FileSystemWatcher检测)。
注意:关于Node.js的Connect也有类似的问题(我认为OWIN的想法是从哪里来的)。
如果您使用的是AppBuilder(Microsoft.Owin.Builder.AppBuilder
)的微软实现,则不能。
在该实现中,中间件存储在专用IList<T>
中,并且没有为该实例提供公共访问。
您可以创建自己的AppBuilder
类,该类必须实现Owin.IAppBuilder
接口。
我没有想太多,但允许删除中间件感觉很痛苦:
中间件可以相互链接。因此,如果你删除了一个,你就必须管理引用它的其他中间件的关系
因此,您不能简单地删除中间件。但是您可以用一个条件来包装中间件的执行。也许有更好的解决方案。
IAppBuilder不会这样做,但您可以在管道中添加自己的阶段。
一个简单的阶段是使用现有的List<Action<OwinContext>> befores;
和List<Action<OwinContext>> afters;
列表。阶段被定义和添加为:
appBuilder.Use(
new Func<Func<IDictionary<string, object>, Task>, Func<IDictionary<string, object>, Task>>(
next => async environment =>
{
var ctx = new OwinContext(environment);
lock(befores)
{
foreach(before in befores)
{
before(ctx);
}
}
await next.Invoke(environment);
lock(afters)
{
foreach(after in afters)
{
after(ctx);
}
}
}));
然后,您可以随心所欲地管理befores
和afters
列表(当然要使用适当的锁定)注意:我通过剥离我使用的代码得到了这个,但我甚至没有尝试编译它。