如何在没有 IAppBuilder 的情况下将中间件添加到 Owin
How to add middleware to Owin without IAppBuilder
我目前正在构建一个包含多个 OWIN 中间件的库。这些中间件应该按照一定的顺序执行。在 OWIN 的第一个版本中,有 IAppBuilder
接口。但是 IAppBuilder
不再是 OWIN 的一部分,而是 Microsoft.Owin 的一部分。我不想强迫我的用户依赖 Microsoft.Owin.
不使用 Microsoft.Owin 将中间件添加到 OWIN 管道的首选方法是什么?
花了一些时间,但我想我明白了。
首先是 Owin 指定的定义:
public delegate Task AppFunc(IDictionary<string, object> environment);
public delegate AppFunc MidFunc(AppFunc next);
public delegate MidFunc MidFactory(IDictionary<string, object> startupProperties);
public delegate void BuildFunc(MidFactory midFactory);
我在这里使用 delegate
以避免泛型疯狂。
从 IAppBuilder
到 BuildFunc
:
public static BuildFunc UseOwin(this IAppBuilder builder)
{
return middleware => builder.Use(middleware(builder.Properties));
}
为了使用 BuildFunc
构建管道,您可以在 BuildFunc
上创建扩展:
public static BuildFunc UseMyFramework(this BuildFunc buildFunc)
{
buildFunc(startupProperties => BuildPipeline(startupProperties));
return buildFunc;
}
return BuildFunc
链接是一个很好的做法。
构建管道只不过是将 MidFunc
链接在一起,并可选择以实际的 AppFunc
:
结束
public static MidFunc BuildPipeline(IDictionary<string, object> startupProperties)
{
return next => LogMiddleware(AuthenticateMiddleware(MyApplication));
// Or this if you don't supply your own AppFunc
return next => LogMiddleware(AuthenticateMiddleware(next));
}
public static AppFunc LogMiddleware(AppFunc next)
{
AppFunc middleware = async environment =>
{
// Log request
await next(environment);
};
return middleware;
}
public static AppFunc AuthenticateMiddleware(AppFunc next)
{
AppFunc middleware = async environment =>
{
// authenticate request
await next(environment);
};
return middleware;
}
public static async Task MyApplication(IDictionary<string, object> environment)
{
await Task.CompletedTask;
}
您仍然需要将 Owin 实现连接到您的框架。我为此使用 Microsoft.Owin:
app.UseOwin().UseMyFramework()
我目前正在构建一个包含多个 OWIN 中间件的库。这些中间件应该按照一定的顺序执行。在 OWIN 的第一个版本中,有 IAppBuilder
接口。但是 IAppBuilder
不再是 OWIN 的一部分,而是 Microsoft.Owin 的一部分。我不想强迫我的用户依赖 Microsoft.Owin.
不使用 Microsoft.Owin 将中间件添加到 OWIN 管道的首选方法是什么?
花了一些时间,但我想我明白了。
首先是 Owin 指定的定义:
public delegate Task AppFunc(IDictionary<string, object> environment);
public delegate AppFunc MidFunc(AppFunc next);
public delegate MidFunc MidFactory(IDictionary<string, object> startupProperties);
public delegate void BuildFunc(MidFactory midFactory);
我在这里使用 delegate
以避免泛型疯狂。
从 IAppBuilder
到 BuildFunc
:
public static BuildFunc UseOwin(this IAppBuilder builder)
{
return middleware => builder.Use(middleware(builder.Properties));
}
为了使用 BuildFunc
构建管道,您可以在 BuildFunc
上创建扩展:
public static BuildFunc UseMyFramework(this BuildFunc buildFunc)
{
buildFunc(startupProperties => BuildPipeline(startupProperties));
return buildFunc;
}
return BuildFunc
链接是一个很好的做法。
构建管道只不过是将 MidFunc
链接在一起,并可选择以实际的 AppFunc
:
public static MidFunc BuildPipeline(IDictionary<string, object> startupProperties)
{
return next => LogMiddleware(AuthenticateMiddleware(MyApplication));
// Or this if you don't supply your own AppFunc
return next => LogMiddleware(AuthenticateMiddleware(next));
}
public static AppFunc LogMiddleware(AppFunc next)
{
AppFunc middleware = async environment =>
{
// Log request
await next(environment);
};
return middleware;
}
public static AppFunc AuthenticateMiddleware(AppFunc next)
{
AppFunc middleware = async environment =>
{
// authenticate request
await next(environment);
};
return middleware;
}
public static async Task MyApplication(IDictionary<string, object> environment)
{
await Task.CompletedTask;
}
您仍然需要将 Owin 实现连接到您的框架。我为此使用 Microsoft.Owin:
app.UseOwin().UseMyFramework()