在 Azure 辅助角色中承载 OWIN

本教程介绍如何在 Microsoft Azure 辅助角色中自托管 OWIN。

.NET (OWIN) .NET 开放 Web 接口定义 .NET Web 服务器和 Web 应用程序之间的抽象。 OWIN 将 Web 应用程序与服务器分离,这使得 OWIN 非常适合在自己的进程(IIS 外部)(例如,在 Azure 辅助角色内部)中自托管 Web 应用程序。

本教程介绍如何在 Microsoft Azure 辅助角色中自托管 OWIN 应用程序。 若要详细了解辅助角色,请参阅 Azure 执行模型

本教程中使用的软件版本

创建 Microsoft Azure 项目

使用管理员权限启动 Visual Studio。 使用 Azure 计算模拟器在本地调试应用程序需要管理员权限。

在“ 文件 ”菜单上,单击“ 新建”,然后单击“ 项目”。 在 “已安装的模板”中,在“Visual C#”下,单击“ ”,然后单击“ Windows Azure 云服务”。 将项目命名为“AzureApp”,然后单击“ 确定”。

示例文件结构图像

“新建 Windows Azure 云服务 ”对话框中,双击“ 辅助角色”。 保留默认名称 (“WorkerRole1”) 。 此步骤将辅助角色添加到解决方案。 单击 “确定”

“Azure 云服务”对话框

创建的 Visual Studio 解决方案包含两个项目:

  • “AzureApp”定义 Azure 应用程序的角色和配置。
  • “WorkerRole1”包含辅助角色的代码。

通常,尽管本教程使用单个角色,但 Azure 应用程序可以包含多个角色。

“解决方案资源管理器”对话框

添加 OWIN Self-Host包

“工具 ”菜单中,单击“ NuGet 包管理器”,然后单击“ 包管理器控制台”。

在“Package Manager Console”窗口中,输入以下命令:

Install-Package Microsoft.Owin.SelfHost

添加 HTTP 终结点

在“解决方案资源管理器”中,展开“AzureApp”项目。 展开“角色”节点,右键单击“WorkerRole1”,然后选择“ 属性”。

添加 HTTP 终结点图示

单击“终结点”,然后单击“添加终结点”

“协议 ”下拉列表中,选择“http”。 在 “公共端口 ”和 “专用端口”中,键入“80”。 这些端口号可以不同。 公共端口是客户端向角色发送请求时使用的内容。

协议选择示例图像

创建 OWIN 启动类

在“解决方案资源管理器”中,右键单击“WorkerRole1”项目,然后选择“添加 / ”以添加新类。 命名类 Startup

将所有样本代码替换为以下内容:

using Owin;

namespace WorkerRole1
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.UseWelcomePage("/");
        }
    }
}

扩展 UseWelcomePage 方法向应用程序添加一个简单的 HTML 页,以验证站点是否正常工作。

启动 OWIN 主机

打开 WorkerRole.cs 文件。 此类定义启动和停止辅助角色时运行的代码。

添加以下 using 语句:

using Microsoft.Owin.Hosting;

IDisposable 成员添加到 WorkerRole 类:

public class WorkerRole : RoleEntryPoint
{
    private IDisposable _app = null;

    // ....
}

OnStart在 方法中,添加以下代码以启动主机:

public override bool OnStart()
{
    ServicePointManager.DefaultConnectionLimit = 12;

    // New code:
    var endpoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Endpoint1"];
    string baseUri = String.Format("{0}://{1}", 
        endpoint.Protocol, endpoint.IPEndpoint);

    Trace.TraceInformation(String.Format("Starting OWIN at {0}", baseUri), 
        "Information");

    _app = WebApp.Start<Startup>(new StartOptions(url: baseUri));
    return base.OnStart();
}

WebApp.Start 方法启动 OWIN 主机。 类的名称 Startup 是 方法的类型参数。 按照约定,主机将调用 Configure 此类的 方法。

OnStop重写 以释放_app实例:

public override void OnStop()
{
    if (_app != null)
    {
        _app.Dispose();
    }
    base.OnStop();
}

下面是 WorkerRole.cs 的完整代码:

using Microsoft.Owin.Hosting;
using Microsoft.WindowsAzure.ServiceRuntime;
using System;
using System.Diagnostics;
using System.Net;
using System.Threading;

namespace WorkerRole1
{
    public class WorkerRole : RoleEntryPoint
    {
        private IDisposable _app = null;

        public override void Run()
        {
            Trace.TraceInformation("WorkerRole entry point called", "Information");

            while (true)
            {
                Thread.Sleep(10000);
                Trace.TraceInformation("Working", "Information");
            }
        }

        public override bool OnStart()
        {
            ServicePointManager.DefaultConnectionLimit = 12;

            var endpoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Endpoint1"];
            string baseUri = String.Format("{0}://{1}", 
                endpoint.Protocol, endpoint.IPEndpoint);

            Trace.TraceInformation(String.Format("Starting OWIN at {0}", baseUri), 
                "Information");

            _app = WebApp.Start<Startup>(new StartOptions(url: baseUri));
           return base.OnStart();
        }

        public override void OnStop()
        {
            if (_app != null)
            {
                _app.Dispose();
            }
            base.OnStop();
        }
    }
}

生成解决方案,然后按 F5 在 Azure 计算模拟器中本地运行应用程序。 根据防火墙设置,可能需要允许模拟器通过防火墙。

计算模拟器将本地 IP 地址分配给终结点。 可以通过查看计算模拟器 UI 来查找 IP 地址。 右键单击任务栏通知区域中的模拟器图标,然后选择“ 显示计算模拟器 UI”。

计算模拟器插图

在“服务部署”、“部署 [id]”、“服务详细信息”下查找 IP 地址。 打开 Web 浏览器并导航到 http:// 地址,其中 address 是计算模拟器分配的 IP 地址;例如 , http://127.0.0.1:80。 应会看到 OWIN 欢迎页:

查找 IP 地址图示

部署到 Azure

对于此步骤,必须有一个 Azure 帐户。 如果没有帐户,只需几分钟即可创建一个免费试用帐户。 有关详细信息,请参阅 Microsoft Azure 免费试用版

在“解决方案资源管理器”中,右键单击“AzureApp”项目。 选择“发布”。

发布 AzureApp 插图

如果未登录到 Azure 帐户,请单击“ 登录”。

登录示例图像

登录后,选择订阅并单击“ 下一步”。

选择订阅映像示例

输入云服务的名称,然后选择一个区域。 单击“创建”。

创建云服务,映像示例

单击“发布” 。

发布新创建的Azure 应用程序,图像示例

“Azure 活动日志”窗口显示部署进度。 部署应用后,浏览到 http://appname.cloudapp.net/,其中 appname 是云服务的名称。

其他资源