我有一个关于OWIN管道的简单问题。我基本上理解了这个规范的全部概念,但是有一些东西我还没有完全理解。
根据几篇在线帖子,有一个OWIN管道,它由几个开发人员定义的模块(或中间件组件)组成,并由owin主机构建。然后是服务器,它将监听请求,并通过OWIN组件的管道传递请求。
我不完全理解的一点是,为什么我们需要一条管道。例如,让我们假设在这个StartUp类中,我们有如下内容:
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.Use<CustomMiddleware>(new CustomComponent());
var config = new HubConfiguration { EnableCrossDomain = true };
app.MapHubs(config);
string exeFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string webFolder = Path.Combine(exeFolder, "Web");
app.UseStaticFiles(webFolder);
}
}在上面的示例中,我们要求OWIN主机构建一个包含三个OWIN中间件组件的管道。据我所知,服务器会将请求(可能包装在字典中)转发到该管道中的第一个组件,然后该组件将执行某些任务并将其传递给下一个组件,依此类推。
我想知道为什么我们需要获取每个请求中涉及的所有组件;例如,如果我们只请求静态html页面,为什么不只麻烦处理静态文件的组件;我的意思是为什么这样的请求需要Web Api的参与。
发布于 2013-09-20 15:58:18
我想我已经说清楚了。事实证明,请求不必在整个管道中移动。流水线中的每个组件负责决定它们是否可以处理请求,或者是否希望将其转发到下一个节点;
发布于 2014-09-26 05:06:26
您的回答是正确的,中间件可能会选择不处理请求。许多Katana中间件实现偏爱“soft404”方法,其中中间件将404解释为“尝试next中间件”。完成Task的第一个中间件将停止进一步的传播并完成响应消息。您可以通过以最可能的顺序插入中间件来优化路径,以获得性能或常用效果。
发布于 2015-03-15 01:29:46
中间件组件是按顺序执行的,在流水线中运行所有组件通常是有意义的,直到其中一个组件决定不调用下一个组件来切断流水线。
这是可能的,因为每个中间件组件都有一个对下一个组件的引用,以及the environment,这是一个对象字典,它的键是一个字符串,它提供对检查请求、创建响应和执行许多其他操作所需的所有内容的访问。(使用字典很聪明,因为很容易添加任何类型的信息或可执行代码,而这些信息或可执行代码是事先不知道的)。
每个组件都可以做以下事情,但它们都是可选的:
管道执行将在其中一种情况下完成:
注意:每个“中间件组件”都是的一个实现
拥有一堆组件是有意义的,如果它们以正确的顺序注册的话。管道可能如下所示:
某种应用程序接口或HTML代的
每个组件都有足够的信息来执行它负责的代码。例如:
由于每个组件都有所有的请求、响应、上下文和任何其他所需的信息,它们都有足够的信息来决定是否必须做某事,修改字典,调用下一个或返回。
因此,正如您所看到的,注册大量中间件组件并不需要为每个请求执行所有这些组件,但有时这是有意义的。
OTOH执行中间件组件的成本可能非常低。例如,如果请求不需要授权,则身份验证可以简单地执行下一个组件。cahing组件也是如此,如果不需要缓存,它可以简单地调用下一个组件。
因此,即使一个组件在流水线中,它也可以有一个廉价的执行,或者它甚至可以完全不运行,这取决于请求。
在您关于静态文件和Web API的特定问题中,其中一个组件将在另一个组件之前重新注册。第一个将根据请求执行并创建响应,或者简单地调用下一个响应。例如,如果静态文件在另一个文件之前注册,则如果请求一个文件,则静态文件将创建响应,并且不会调用Web API。如果请求不是针对文件的,那么它只会调用下一个组件: Web API组件。
https://stackoverflow.com/questions/18902136
复制相似问题