gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:57:23 26 4
gpt4 key购买 nike

我目前正在构建一个包含多个 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;
}

返回 BuildFunc 是一个好习惯用于链接。

搭建管道无非就是链接 MidFunc s 一起并可选择以实际 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 - 如何在没有 IAppBuilder 的情况下向 Owin 添加中间件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42530236/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com