OWIN 和 Katana 入门

.NET (OWIN) .NET 开放 Web 接口 定义 .NET Web 服务器和 Web 应用程序之间的抽象。 通过分离 Web 服务器与应用程序,OWIN 可以更轻松地为 .NET Web 开发创建中间件。 此外,OWIN 还可以更轻松地将 Web 应用程序移植到其他主机,例如,在 Windows 服务或其他进程中进行自承载。

OWIN 是社区拥有的规范,而不是实现。 Katana 项目是由 Microsoft 开发的一组开源 OWIN 组件。 有关 OWIN 和 Katana 的一般概述,请参阅 Project Katana 概述。 在本文中,我将直接跳转到代码中以开始使用。

本教程使用 Visual Studio 2013 候选发布,但也可以使用 Visual Studio 2012。 Visual Studio 2012 中的一些步骤有所不同,我在下面注意这一点。

在 IIS 中托管 OWIN

在本部分中,我们将在 IIS 中托管 OWIN。 此选项使你能够灵活地将 OWIN 管道与 IIS 的成熟功能集组合在一起。 使用此选项,OWIN 应用程序在 ASP.NET 请求管道中运行。

首先,创建一个新的 ASP.NET Web 应用程序项目。 (在 Visual Studio 2012 中,使用 ASP.NET 空 Web 应用程序项目类型。)

新建 ASP.NET 项目图示

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

示例插图

添加 NuGet 包

接下来,添加所需的 NuGet 包。 从 “工具 ”菜单中选择“ NuGet 包管理器”,然后选择“ 包管理器控制台”。 在“包管理器控制台”窗口中,键入以下命令:

install-package Microsoft.Owin.Host.SystemWeb –Pre

安装包管理器,示例插图

添加 Startup 类

接下来,添加 OWIN 启动类。 在“解决方案资源管理器”中,右键单击项目并选择“添加”,然后选择“新建项”。 在 “添加新项 ”对话框中,选择“ Owin Startup 类”。 有关配置启动类的详细信息,请参阅 OWIN 启动类检测

添加 Startup 类示例

将以下代码添加到 Startup1.Configuration 方法中:

public void Configuration(IAppBuilder app)
{
    // New code:
    app.Run(context =>
    {
        context.Response.ContentType = "text/plain";
        return context.Response.WriteAsync("Hello, world.");
    });
}

此代码将一个简单的中间件添加到 OWIN 管道,该中间件作为接收 Microsoft.Owin.IOwinContext 实例的函数实现。 当服务器收到 HTTP 请求时,OWIN 管道会调用中间件。 中间件设置响应的内容类型并写入响应正文。

注意

OWIN Startup 类模板在 Visual Studio 2013 中提供。 如果使用 Visual Studio 2012,只需添加名为 Startup1的新空类,并粘贴以下代码:

using System;
using System.Threading.Tasks;
using Microsoft.Owin;
using Owin;

[assembly: OwinStartup(typeof(OwinApp.Startup1))]

namespace OwinApp
{
    public class Startup1
    {
        public void Configuration(IAppBuilder app)
        {
          app.Run(context =>
          {
              context.Response.ContentType = "text/plain";
              return context.Response.WriteAsync("Hello, world.");
          });
        }
    }
}

运行应用程序

按下 F5 以便开始调试。 Visual Studio 将打开浏览器窗口。http://localhost:*port*/ 页面应如下所示:

成功加载页面图示

在控制台应用程序中Self-Host OWIN

可以轻松地在自定义进程中将此应用程序从 IIS 托管转换为自承载。 使用 IIS 托管,IIS 既充当 HTTP 服务器,又充当承载服务的进程。 使用自承载,应用程序将创建进程并使用 HttpListener 类作为 HTTP 服务器。

在 Visual Studio 中创建新的控制台应用程序。 在“包管理器控制台”窗口中,键入以下命令:

Install-Package Microsoft.Owin.SelfHost -Pre

Startup1将本教程第 1 部分的类添加到项目。 无需修改此类。

按如下所示实现应用程序的 Main 方法。

class Program
{
    static void Main(string[] args)
    {
        using (Microsoft.Owin.Hosting.WebApp.Start<Startup1>("http://localhost:9000"))
        {
            Console.WriteLine("Press [enter] to quit...");
            Console.ReadLine();
        }
    }
}

运行控制台应用程序时,服务器将开始侦听 http://localhost:9000。 如果在 Web 浏览器中导航到此地址,将看到“Hello world”页面。

控制台侦听图像示例

添加 OWIN 诊断

Microsoft.Owin.Diagnostics 包包含可捕获未经处理的异常并显示包含错误详细信息的 HTML 页面的中间件。 此页面的功能非常类似于 ASP.NET 错误页,该页有时称为“死亡的黄色屏幕” (YSOD) 。 与 YSOD 一样,Katana 错误页在开发过程中很有用,但最好在生产模式下禁用它。

若要在项目中安装诊断包,请在“包管理器控制台”窗口中键入以下命令:

install-package Microsoft.Owin.Diagnostics –Pre

更改 方法中的 Startup1.Configuration 代码,如下所示:

public void Configuration(IAppBuilder app)
{
    // New code: Add the error page middleware to the pipeline. 
    app.UseErrorPage();

    app.Run(context =>
    {
        // New code: Throw an exception for this URI path.
        if (context.Request.Path.Equals(new PathString("/fail")))
        {
            throw new Exception("Random exception");
        }

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

现在使用 CTRL+F5 在不调试的情况下运行应用程序,以便 Visual Studio 不会在异常时中断。 应用程序的行为与之前相同,直到导航到 http://localhost/fail,此时应用程序会引发异常。 错误页中间件将捕获异常并显示一个 HTML 页面,其中包含有关错误的信息。 可以单击选项卡以查看堆栈、查询字符串、Cookie、请求标头和 OWIN 环境变量。

随机执行图像示例

后续步骤