如何在没有 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 以避免泛型疯狂。

IAppBuilderBuildFunc:

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()