------转载:http://www.nmtree.net/2014/06/13/getting-started-with-owin-and-katana.html
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项目。
在新建ASP.NET项目对话框中,选择Empty模板。
添加NuGet程序包
从工具菜单,选择NuGet程序包管理器,然后选择程序包管理器控制台。在程序包管理器控制台窗口中,键入下面的命令:
1
|
Install-Package Microsoft.Owin.Host.SystemWeb -Pre
|
添加Startup类
接下来,添加一个OWIN startup类。在解决方案资源管理器中,右击项目,选择添加,然后选择新建项。在新建项对话框中,选择Owin Startup类。关于配置startup类的更多信息,参与OWIN启动类检测。
在Startup.Configuration方法中添加如下代码:
1
2
3
4
5
6
7
8
9
|
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
从IIS托管转换到自定义进程的自我托管很容易。对于IIS托管,IIS既充当HTTP服务器又充当托管在服务器中的进程。而对于自我托管,应用程序创建进程,然后使用HttpListener作为HTTP服务器。
在Visual Studio中,创建一个控制台应用程序,在程序包管理器控制台中,键入以下命令
1
|
Install-Package Microsoft.Owin.SelfHost -Pre
|
将前面添加的Startup类添加到本项目,不需要修改代码。
在Main方法中实现如下代码:
1
2
3
4
5
6
7
8
|
static
void
Main(
string
[] args)
{
{
Console.WriteLine(
"Press [enter] to quit..."
);
Console.ReadLine();
}
}
|
当运行控制台程序时,服务器开始监听http://localhost:5000。如果在浏览器导航到该地址,就会看“Hello world”页面。
添加OWIN诊断
Microsoft.Owin.Diagnostics程序包包含捕获未处理异常并显示一个带有详细错误的HTML页面的中间件。这个页面的功能类似于ASP.NET的错误页面(有时被称为yellow screen of death YSOD)。类似于YSOD,Katana错误页在开发阶段很有用,但是在生产环境下禁用掉是一个好的实践。
在程序包管理器控制台键入下面的命令安装Diagnostics程序包:
1
|
Install-Package Microsoft.Owin.Diagnostics –Pre
|
如下修改Startup.Configuration方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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环境变量信息。