首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于OWIN管道

关于OWIN管道
EN

Stack Overflow用户
提问于 2013-09-20 02:17:46
回答 3查看 1.6K关注 0票数 4

我有一个关于OWIN管道的简单问题。我基本上理解了这个规范的全部概念,但是有一些东西我还没有完全理解。

根据几篇在线帖子,有一个OWIN管道,它由几个开发人员定义的模块(或中间件组件)组成,并由owin主机构建。然后是服务器,它将监听请求,并通过OWIN组件的管道传递请求。

我不完全理解的一点是,为什么我们需要一条管道。例如,让我们假设在这个StartUp类中,我们有如下内容:

代码语言:javascript
复制
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的参与。

EN

回答 3

Stack Overflow用户

发布于 2013-09-20 15:58:18

我想我已经说清楚了。事实证明,请求不必在整个管道中移动。流水线中的每个组件负责决定它们是否可以处理请求,或者是否希望将其转发到下一个节点;

票数 3
EN

Stack Overflow用户

发布于 2014-09-26 05:06:26

您的回答是正确的,中间件可能会选择不处理请求。许多Katana中间件实现偏爱“soft404”方法,其中中间件将404解释为“尝试next中间件”。完成Task的第一个中间件将停止进一步的传播并完成响应消息。您可以通过以最可能的顺序插入中间件来优化路径,以获得性能或常用效果。

票数 2
EN

Stack Overflow用户

发布于 2015-03-15 01:29:46

中间件组件是按顺序执行的,在流水线中运行所有组件通常是有意义的,直到其中一个组件决定不调用下一个组件来切断流水线。

这是可能的,因为每个中间件组件都有一个对下一个组件的引用,以及the environment,这是一个对象字典,它的键是一个字符串,它提供对检查请求、创建响应和执行许多其他操作所需的所有内容的访问。(使用字典很聪明,因为很容易添加任何类型的信息或可执行代码,而这些信息或可执行代码是事先不知道的)。

每个组件都可以做以下事情,但它们都是可选的:

  • 在调用下一个组件之前执行代码(通常检查和修改管道的下一个中间件组件的环境(这也会做同样的事情)
  • 在下一个组件完成异常后执行一些代码(有意或由于未处理的错误)

管道执行将在其中一种情况下完成:

  • 中间件组件不调用下一个
  • 中间件组件抛出异常

注意:每个“中间件组件”都是的一个实现

拥有一堆组件是有意义的,如果它们以正确的顺序注册的话。管道可能如下所示:

某种应用程序接口或HTML代的

  • authentication
  • authorization
  • caching
  • execution

每个组件都有足够的信息来执行它负责的代码。例如:

  • authentication将被执行,并在字典中设置委托人的信息。然后它将调用下一个: authorization component
  • depending对请求和身份验证的结果,授权组件将决定主体是否有权限执行请求,并调用下一个组件(缓存),或拒绝请求缓存也可以决定是否可以返回缓存的结果,或必须调用下一个component
  • the最后一个组件将执行,并可能会创建响应,而不会调用任何其他组件
  • 。调用堆栈将以相反的顺序运行,使每个组件都有可能执行一些estra工作。例如,缓存组件可以缓存响应,接下来的响应(授权和身份验证)将直接返回,而不执行任何额外的代码。

由于每个组件都有所有的请求、响应、上下文和任何其他所需的信息,它们都有足够的信息来决定是否必须做某事,修改字典,调用下一个或返回。

因此,正如您所看到的,注册大量中间件组件并不需要为每个请求执行所有这些组件,但有时这是有意义的。

OTOH执行中间件组件的成本可能非常低。例如,如果请求不需要授权,则身份验证可以简单地执行下一个组件。cahing组件也是如此,如果不需要缓存,它可以简单地调用下一个组件。

因此,即使一个组件在流水线中,它也可以有一个廉价的执行,或者它甚至可以完全不运行,这取决于请求。

在您关于静态文件和Web API的特定问题中,其中一个组件将在另一个组件之前重新注册。第一个将根据请求执行并创建响应,或者简单地调用下一个响应。例如,如果静态文件在另一个文件之前注册,则如果请求一个文件,则静态文件将创建响应,并且不会调用Web API。如果请求不是针对文件的,那么它只会调用下一个组件: Web API组件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18902136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档