OWIN中间件使用的实际例子

时间:2015-04-14 16:16:46

标签: asp.net-web-api owin katana

我认为自己是OWIN的初级新手,在阅读了大量文档之后,我对比起之前的冲突概念感到困惑。我知道这些是多个问题,但我觉得回答这些问题将清除对OWIN以及如何最好地使用它的最基本的疑问。以下是我的问题:

  1. 我可以使用OWIN中间件,但我无法使用它 消息处理程序或HTTP模块?或者他们都是一回事 除了后两者与IIS紧密结合?
  2. 很多文档说OWIN允许在它们之间进行解耦 Web服务器和Web应用程序即。删除对IIS的依赖 用于托管说Web API应用程序。但我还没有看到 使用OWIN的一些Web应用程序或web api的示例 成功移植到IIS上,然后是其他一些网站 服务器。 IIS和自托管也是唯一的方法 Web服务器和Web应用程序之间的分离?
  3. 当我搜索OWIN中间件示例时,我只有Katana和 Helios是OWIN规范中唯一的两个实现。 Katana几乎已经完成并且不会超越Revision3而Helios尚未得到支持 微软根据一些文章。那么OWIN的未来是什么呢? 那个案子?
  4. 到目前为止我唯一详细的实际用法是 使用OWIN进行身份验证使用OAuth 2.任何其他此类用法 将OWIN实施保持在中间?
  5. 在我的启动课程的配置方法中,我尝试将链接简单化 中间件代码片段如下所示,以便能够查看请求 被送入: - enter image description here
  6. 但有错误:

    enter image description here

    如何查看请求并为中间件中的下一个组件修改它?

    1. 您插入的各种中间件有哪些? 在Web服务器和应用程序之间的项目中?
    2. 感谢您回答上述任何或所有这些问题。

1 个答案:

答案 0 :(得分:13)

  

我可以使用OWIN中间件,因为我还没有使用消息处理程序或HTTP模块吗?或者它们是相同的,除了后两者与IIS紧密耦合?

与IIS脱钩是其中的一部分。 OWIN中间件是一个管道,允许某些“OWIN意识”的东西参与请求,如果他们选择的话。 IHttpHandler只处理一件事 - 它们不能连锁。我喜欢将管道更多地与Global.asax进行比较。我已经看到很多填充的Global.asax处理程序执行各种各样的事情,如身份验证,授权,吐出HTTP标头,如P3P策略,X-Frame-Options等。部分问题是从中开发可重用的组件很困难,依赖于IIS。 OWIN试图消除这些问题。

  

许多文档都说OWIN允许在Web服务器和Web应用程序之间进行分离,即。删除依赖IIS来托管说Web API应用程序。但我还没有看到一些使用OWIN的Web应用程序或web api的示例,并成功移植到IIS上,然后是其他一些Web服务器。那么IIS和自托管是在Web服务器和Web应用程序之间实现这种分离的唯一方法吗?

对于WebAPI 2和SignalR 2来说也是如此。目前,MVC 5及更早版本无法真正与IIS分离。 MVC 6将解决这个问题,并且是一个相当大的改革。 ASP.NET网站在控制台应用程序上的SignalR自托管上有一个tutorial or two。您将在教程中看到Startup类,就像它在IIS或IIS Express上运行一样。 Console App唯一不同的功能是它使用Main方法在HttpListener中引导服务器。

  

[评论]关于上面的第2点,这里的owin组件是什么? Katana是一个owin组件还是我们使用Katana或两者组合在一起的代码?

OWIN实际上并不是Web应用程序和Web服务器之间的抽象层,实际上是一个规范。根据您要运行的服务器,OWIN有不同的“实现”--Katana是运行WebAPI 2和SignalR 2的OWIN实现.Kestrel是OWIN实现的另一个示例。

  

当我搜索OWIN中间件示例时,我只获得了Katana和Helios,这是OWIN规范中唯一的两个实现。 Katana几乎已经完成并且不会超出版本3,并且根据一些文章,微软尚不支持Helios。那么在这种情况下OWIN的未来是什么?

这仍然有点悬而未决,但OWIN正用于开发Kestrel Web服务器,允许ASP.NET 5 Core在Linux / OS X上运行。

  

到目前为止,我所看到的唯一详细的实际用法是使用OAW 2进行身份验证的OWIN。还有其他任何将OWIN实现保留在中间的用法吗?

SignalR和WebAPI也使用OWIN。这很有用,因此您可以将SignalR Hub作为Windows服务运行,与Web API一样。

  

将OWIN实施保留在中间的任何其他此类用法?

平台独立性。将OWIN放在中间意味着我可以将我的MVC 6 Core Web应用程序从IIS上运行到我的Mac上的Kestrel,并且OWIN实现可以完成其余工作。

  

在我的启动类的配置方法中,我尝试将简单的中间件代码片段链接如下,并且能够看到正在发送的请求。

context.Request在OWIN中没有索引器。请改用Get<>

app.Use(async (context, next) =>
{
    context.Response.Write("hello world 2: " + context.Request.Get<object>("owin.RequestBody"));
    await next();
});

请注意owin.RequestBody是一个实现细节,实际的返回类型是内部的。我不确定你想要获得什么,如果你想要一个查询字符串,请使用请求中的Query,或者Headers如果你想要一个HTTP头。

  

您在Web服务器和应用程序之间插入项目的各种中间件有哪些?

处理安全性的事情,就像我在内容安全策略中处理nonce的中间件组件一样,我在我的个人博客here上写了这些内容。它的要点是它允许我添加带有现时的HTTP标头:

public void Configuration(IAppBuilder app)
{
    app.Use((context, next) =>
    {
        var rng = new RNGCryptoServiceProvider();
        var nonceBytes = new byte[16];
        rng.GetBytes(nonceBytes);
        var nonce = Convert.ToBase64String(nonceBytes);
        context.Set("ScriptNonce", nonce);
        context.Response.Headers.Add("Content-Security-Policy",
            new[] {string.Format("script-src 'self' 'nonce-{0}'", nonce)});
        return next();
    });
    //Other configuration...
}

从那里,在我的Razor视图中,我可以将随机数添加到<script>元素,从owin上下文中获取令牌。


还有很多其他东西可供使用。其他框架现在可以轻松地将自己注入到请求/响应过程中。 NancyFx框架现在可以使用OWIN。