OWIN中间件使用的实际例子

use*_*358 14 asp.net-web-api owin katana

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

  1. 有什么可以使用OWIN中间件,我还没有使用消息处理程序或HTTP模块?或者它们是否相同,只是后两者与IIS紧密耦合?
  2. 很多文档都说OWIN允许在Web服务器和Web应用程序之间进行分离,即.删除依赖IIS来托管说Web API应用程序.但我还没有看到一些使用OWIN的Web应用程序或web api的示例,并成功移植到IIS上,然后是其他一些Web服务器.IIS和自托管是唯一的方法来实现Web服务器和Web应用程序之间的这种分离吗?
  3. 当我搜索OWIN中间件示例时,我只获得了Katana和Helios,这是OWIN规范中唯一的两个实现.Katana几乎已经完成并且不会超出版本3,并且根据一些文章,微软尚不支持Helios.那么在这种情况下OWIN的未来是什么?
  4. 到目前为止,我所看到的唯一详细的实际用法是使用OAW进行身份验证的OWIN 2.还有其他任何将OWIN实现保留在中间的用法吗?
  5. 在我的启动类的配置方法中,我尝试将简单的中间件代码片段链接如下,并且能够看到发送的请求: - 在此输入图像描述

但是有错误:

在此输入图像描述

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

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

感谢您回答上述任何或所有这些问题.

vcs*_*nes 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网站在Console应用程序上有一个或两个关于SignalR自托管的教程.您将在教程中看到一个Startup类,就像它在IIS或IIS Express上运行一样.Console App唯一不同的是它在Main方法中使用HttpListener引导服务器.

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

在Web应用程序和Web服务器之间,OWIN实际上并不是一个抽象层,实际上是一个规范.根据您要运行的服务器,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进行身份验证的OWIN 2.还有其他任何将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();
});
Run Code Online (Sandbox Code Playgroud)

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

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

处理安全性的事情,比如在内容安全策略中处理nonce的中间件组件,我在这里写了我的个人博客.它的要点是它允许我添加带有nonce的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...
}
Run Code Online (Sandbox Code Playgroud)

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


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