共用方式為


在 Azure 背景工作角色中裝載 ASP.NET Web API 2

演講者:Mike Wasson

本教學課程示範如何使用 OWIN 自我裝載 Web API 架構,在 Azure 背景工作角色中裝載 ASP.NET Web API。

Open Web Interface for .NET (OWIN) 定義了 .NET Web 伺服器和 Web 應用程式之間的抽象層。 OWIN 將 Web 應用程式與伺服器解耦,這使得 OWIN 非常適合在 IIS 外部 (例如,在 Azure 背景工作角色內部) 您自己的程序中自我裝載 Web 應用程式。

在本教學課程中,您將使用 Microsoft.Owin.Host.HttpListener 套件,它提供用於自我裝載 OWIN 應用程式的 HTTP 伺服器。

教學課程中使用的軟體版本

建立 Microsoft Azure 專案

使用管理員權限啟動 Visual Studio。 使用 Azure 計算模擬器在本機偵錯應用程式需要管理員權限。

在「檔案」功能表上,按一下「新增」,然後按一下「專案」。 從「已安裝的範本」中的 Visual C# 下,按一下「雲端」,然後按一下「Windows Azure 雲端服務」。 將專案命名為「AzureApp」並按一下「確定」。

「新專案」對話方塊的螢幕擷取畫面,醒目顯示功能表選項中建立 Azure 應用程式專案的步驟。

在「新 Windows Azure 雲端服務」對話方塊中,按兩下「背景工作角色」。 保留預設名稱 (「WorkerRole1」)。 此步驟為解決方案新增背景工作角色。 按一下 [確定]

「新 Windows Azure 雲端服務」對話方塊的螢幕擷取畫面,顯示用於建立背景工作角色的功能表選項。

建立的 Visual Studio 解決方案包含兩個專案:

  • 「AzureApp」定義Azure應用程式的角色和設定。
  • 「WorkerRole1」包含背景工作角色的程式碼。

通常,Azure 應用程式可以包含多個角色,但本教學課程使用單一角色。

方案總管視窗的螢幕擷取畫面,醒目顯示新的 Azure 應用程式專案並在其下方顯示應用程式名稱和背景工作角色選項。

新增 Web API 和 OWIN 套件

從「工具」功能表中,按一下「NuGet 套件管理員」,然後按一下「套件管理員主控台」。

在「套件管理員主控台」視窗中,輸入以下命令:

Install-Package Microsoft.AspNet.WebApi.OwinSelfHost

新增 HTTP 端點

在方案總管中,展開 AzureApp 專案。 展開角色節點,以滑鼠右鍵按一下 WorkerRole1,然後選擇「屬性」。

方案總管視窗功能表的螢幕擷取畫面,醒目顯示了選擇背景工作角色的屬性設定的步驟。

按一下「端點」,然後按一下「新增端點」。

通訊協定下拉式清單中,選擇「http」。 在公用連接埠私人連接埠中,鍵入 80。 這些連接埠號碼可以不同。 公共連接埠是用戶端向角色傳送請求時使用的連接埠。

顯示不同服務設定和端點選擇的通訊協定下拉式功能表選項的螢幕擷取畫面。

設定 Web API 以自我裝載

在「方案總管」中,以滑鼠右鍵按一下「WorkerRole1」專案,然後選擇「新增 / 類別」以新增類別。 將類別命名為 Startup

方案總管視窗的螢幕擷取畫面,顯示功能表選項並醒目顯示新增類別的路徑。

將此文件中的所有樣板程式碼替換為以下內容:

using Owin;
using System.Web.Http;

namespace WorkerRole1
{
    class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            HttpConfiguration config = new HttpConfiguration();
            config.Routes.MapHttpRoute(
                "Default",
                "{controller}/{id}",
                new { id = RouteParameter.Optional });

            app.UseWebApi(config);
        }
    }
}

新增 Web API 控制器

接下來,新增一個 Web API 控制器類別。 以滑鼠右鍵按一下 WorkerRole1 專案,然後選擇新增 / 類別。 將類別命名為 TestController。 將此文件中的所有樣板程式碼替換為以下內容:

using System;
using System.Net.Http;
using System.Web.Http;

namespace WorkerRole1
{
    public class TestController : ApiController
    {
        public HttpResponseMessage Get()
        {
            return new HttpResponseMessage()
            {
                Content = new StringContent("Hello from OWIN!")
            };
        }

        public HttpResponseMessage Get(int id)
        {
            string msg = String.Format("Hello from OWIN (id = {0})", id);
            return new HttpResponseMessage()
            {
                Content = new StringContent(msg)
            };
        }
    }
}

為簡單起見,此控制器僅定義了兩個傳回純文字的 GET 方法。

啟動 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("WebApiRole 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 計算模擬器中本機執行應用程式。 根據您的防火牆設定,您可能需要允許仿真器通過防火牆。

注意

如果您遇到以下例外狀況,請參閱這篇部落格文章以取得解決方法。 「無法載入檔案或組件「Microsoft.Owin,Version=2.0.2.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35」或其依賴項之一。 找到的組件資訊清單定義不符合組件參考。 (HRESULT:0x80131040 例外狀況)」

計算模擬器會為端點指派本機 IP 位址。 您可以透過查看計算模擬器 UI 找到 IP 位址。 以滑鼠右鍵按一下工作列通知區域中的仿真器圖示,然後選擇「顯示計算模擬器 UI」。

Azure 計算模擬器 UI 的螢幕擷取畫面,顯示選擇「服務詳細資料」選項時的功能表和 IP 終端點位址資訊。

在服務部署、部署 [id]、服務詳細資料下找到 IP 位址。 開啟網頁瀏覽器並瀏覽到 http://address/test/1,其中 address 是計算模擬器分配的 IP 位址;例如,http://127.0.0.1:80/test/1。 您應該會看到來自 Web API 控制器的回應:

瀏覽器視窗的螢幕擷取畫面,顯示輸入計算模擬器指派的 IP 位址後 Web API 控制器的回應。

部署至 Azure

在這一步驟中,您必須擁有 Azure 帳戶。 如果您還沒有,只需幾分鐘即可建立免費試用帳戶。 有關詳細資訊,請參閱「Microsoft Azure 免費試用」。

在方案總管中,以滑鼠右鍵按一下 AzureApp 專案。 選取發行

方案總管視窗的功能表選項的螢幕擷取畫面,其中醒目顯示了部署或發布專案所需遵循的步驟。

如果您尚未登入 Azure 帳戶,請按一下「登入」。

「發布 Azure 應用程式」對話方塊的螢幕擷取畫面,該對話方塊要求在其他選項可用之前提供登入選項。

登入後,選擇訂閱並點擊「下一步」。

登入後「發布 Azure 應用程式」的螢幕擷取畫面,提示使用者在繼續下一步之前選擇訂閱類型。

輸入雲端服務的名稱並選擇區域。 按一下 [建立]。

「建立雲端服務和儲存帳戶」對話方塊的螢幕擷取畫面,要求使用者輸入其應用程式服務的名稱和區域。

按一下發行

「發布 Azure 應用程式」視窗的螢幕擷取畫面,確認所做的所有設定選擇,並提供用於傳回或發布的按鈕選項。

為 Azure 雲端服務 (經典版) 設定自訂網域名稱

其他資源