我认为自己是OWIN的初级新手,在阅读了大量文档之后,我对比起之前的冲突概念感到困惑。我知道这些是多个问题,但我觉得回答这些问题将清除对OWIN以及如何最好地使用它的最基本的疑问。以下是我的问题:
但有错误:
如何查看请求并为中间件中的下一个组件修改它?
感谢您回答上述任何或所有这些问题。
答案 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。