如何在没有IAppBuilder的情况下向Owin添加中间件

Jer*_*oen 7 owin katana

我目前正在构建一个包含几个OWIN中间件的库.这些中间件应按特定顺序执行.在OWIN的第一个版本中,有一个IAppBuilder界面.但是,IAppBuilder它不再是OWIN的一部分,而是Microsoft.Owin的一部分.我不想强迫我的用户依赖Microsoft.Owin.

在不使用Microsoft.Owin的情况下,将中间件添加到OWIN管道的首选方法是什么?

Jer*_*oen 0

虽然花了一些时间,但我想我已经明白了。

首先是 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);
Run Code Online (Sandbox Code Playgroud)

delegate在这里使用是为了避免泛型的疯狂。

IAppBuilderBuildFunc:

public static BuildFunc UseOwin(this IAppBuilder builder)
{
    return middleware => builder.Use(middleware(builder.Properties));
}
Run Code Online (Sandbox Code Playgroud)

为了使用 构建管道BuildFunc,您可以在 上创建扩展BuildFunc

public static BuildFunc UseMyFramework(this BuildFunc buildFunc)
{
    buildFunc(startupProperties => BuildPipeline(startupProperties));

    return buildFunc;
}
Run Code Online (Sandbox Code Playgroud)

返回BuildFuncfor 链接是一个很好的做法。

构建管道只不过是将MidFuncs 连接在一起,并可选择以实际的 结尾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;
}
Run Code Online (Sandbox Code Playgroud)

您仍然需要将 Owin 实现连接到您的框架。我为此使用 Microsoft.Owin:

app.UseOwin().UseMyFramework()
Run Code Online (Sandbox Code Playgroud)