如何删除 OWIN 中的中间件?
How to remove middleware in OWIN?
我已经在 Configuration
方法中注册了一个 OWIN 中间件。我怎样才能更改删除中间件。
特别是,我想在某些文件更改后修改 (remove/add) StaticFiles 中间件(我希望通过 FileSystemWatcher 检测)。
注意: a similar question 关于 Node.js 的连接(我认为 OWIN 的想法来自哪里)。
如果您使用的是 AppBuilder 的 Microsoft 实现 (Microsoft.Owin.Builder.AppBuilder
),则不能。
在此实现中,中间件存储在私有 IList<T>
中,并且没有为此实例提供 public 访问权限。
您可以创建自己的 AppBuilder
class,它必须实现 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
列表(当然要适当锁定)。 警告:我通过剥离我使用的代码得到了这个,但我什至没有尝试编译它。
我已经在 Configuration
方法中注册了一个 OWIN 中间件。我怎样才能更改删除中间件。
特别是,我想在某些文件更改后修改 (remove/add) StaticFiles 中间件(我希望通过 FileSystemWatcher 检测)。
注意: a similar question 关于 Node.js 的连接(我认为 OWIN 的想法来自哪里)。
如果您使用的是 AppBuilder 的 Microsoft 实现 (Microsoft.Owin.Builder.AppBuilder
),则不能。
在此实现中,中间件存储在私有 IList<T>
中,并且没有为此实例提供 public 访问权限。
您可以创建自己的 AppBuilder
class,它必须实现 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
列表(当然要适当锁定)。 警告:我通过剥离我使用的代码得到了这个,但我什至没有尝试编译它。