Open Web Interface for .NET (OWIN)定义了.NET web服务器和web应用程序间的抽象。OWIN通过将web服务器从应用程序解耦,使得为.NET web开发创建中间件和移植web应用程序到其他托管——比如,Window服务或其他进程的自我托管——变得更加容易。

OWIN是一个社区所有的规范,而非实现。Katana项目是由微软开发的开源OWIN组件集合。关于OWIN和Katana的介绍,请参阅Katana项目概述

IIS托管OWIN

本节,我们将OWIN托管在IIS中。使用此选项,OWIN应用程序运行在ASP.NET请求管道中。

首先,新建一个新的ASP.NET Web Application项目。

OWIN和Katana入门-程序旅途

新建ASP.NET项目对话框中,选择Empty模板。

OWIN和Katana入门-程序旅途

添加NuGet程序包

工具菜单,选择NuGet程序包管理器,然后选择程序包管理器控制台。在程序包管理器控制台窗口中,键入下面的命令:

Install-Package Microsoft.Owin.Host.SystemWeb -Pre
OWIN和Katana入门-程序旅途

添加Startup类

接下来,添加一个OWIN startup类。在解决方案资源管理器中,右击项目,选择添加,然后选择新建项。在新建项对话框中,选择Owin Startup类。关于配置startup类的更多信息,参与OWIN启动类检测

OWIN和Katana入门-程序旅途

在Startup.Configuration方法中添加如下代码:

        public void Configuration(IAppBuilder app)
        {
            // 有关如何配置应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkID=316888
            app.Run(context =>
            {
                context.Response.ContentType = "text/plain";
                return context.Response.WriteAsync("Hello, world.");
            });
        }

这段代码添加一个简单的中间件到OWIN管道,实现为一个接收Microsoft.Owin.IOwinContext实例的功能。当服务器接收到一个HTTP请求时,OWIN管道调用中间件。中间件设置响应的内容类型并将内容写入响应的body中。

运行程序

按F5启动调试。Visual Studio会打开一个链接到http://localhost:port/的浏览器窗口。页面看起来如下所示:

OWIN和Katana入门-程序旅途

控制台应用程序中自我托管OWIN

从IIS托管转换到自定义进程的自我托管很容易。对于IIS托管,IIS既充当HTTP服务器又充当托管在服务器中的进程。而对于自我托管,应用程序创建进程,然后使用HttpListener作为HTTP服务器。

在Visual Studio中,创建一个控制台应用程序,在程序包管理器控制台中,键入以下命令

Install-Package Microsoft.Owin.SelfHost -Pre

将前面添加的Startup类添加到本项目,不需要修改代码。

在Main方法中实现如下代码:

        static void Main(string[] args)
        {
            using (WebApp.Start<Startup>("http://localhost:5000"))
            {
                Console.WriteLine("Press [enter] to quit...");
                Console.ReadLine();
            }
        }

当运行控制台程序时,服务器开始监听http://localhost:5000。如果在浏览器导航到该地址,就会看“Hello world”页面。

OWIN和Katana入门-程序旅途

添加OWIN诊断

Microsoft.Owin.Diagnostics程序包包含捕获未处理异常并显示一个带有详细错误的HTML页面的中间件。这个页面的功能类似于ASP.NET的错误页面(有时被称为yellow screen of death  YSOD)。类似于YSOD,Katana错误页在开发阶段很有用,但是在生产环境下禁用掉是一个好的实践。

在程序包管理器控制台键入下面的命令安装Diagnostics程序包:

Install-Package Microsoft.Owin.Diagnostics –Pre

如下修改Startup.Configuration方法

        public void Configuration(IAppBuilder app)
        {
            //添加错误页中间节到管道
            app.UseErrorPage();
            app.Run(context =>
            {
                if (context.Request.Path.Value == "/fail")
                {
                    throw new Exception("Random exception");
                }

                context.Response.ContentType = "text/plain";
                return context.Response.WriteAsync("Hello, world.");
            });
        }

使用CTRL+F5不调试运行程序。程序运行结果和之前一样,但是当导航到http://localhost:62222/fail时程序就会抛出异常。错误页中间件捕获到异常,并显示一个带有错误信息的HTML页。在错误页中,可以点击tab查看stack,query string,cookies,request header和OWIN环境变量信息。

OWIN和Katana入门-程序旅途