在 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 伺服器。
教學課程中使用的軟體版本
- Visual Studio 2013
- Web API 2
- Azure SDK for .NET 2.3
建立 Microsoft Azure 專案
使用管理員權限啟動 Visual Studio。 使用 Azure 計算模擬器在本機偵錯應用程式需要管理員權限。
在「檔案」功能表上,按一下「新增」,然後按一下「專案」。 從「已安裝的範本」中的 Visual C# 下,按一下「雲端」,然後按一下「Windows Azure 雲端服務」。 將專案命名為「AzureApp」並按一下「確定」。
在「新 Windows Azure 雲端服務」對話方塊中,按兩下「背景工作角色」。 保留預設名稱 (「WorkerRole1」)。 此步驟為解決方案新增背景工作角色。 按一下 [確定]。
建立的 Visual Studio 解決方案包含兩個專案:
- 「AzureApp」定義Azure應用程式的角色和設定。
- 「WorkerRole1」包含背景工作角色的程式碼。
通常,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」。
在服務部署、部署 [id]、服務詳細資料下找到 IP 位址。 開啟網頁瀏覽器並瀏覽到 http://address/test/1,其中 address 是計算模擬器分配的 IP 位址;例如,http://127.0.0.1:80/test/1
。 您應該會看到來自 Web API 控制器的回應:
部署至 Azure
在這一步驟中,您必須擁有 Azure 帳戶。 如果您還沒有,只需幾分鐘即可建立免費試用帳戶。 有關詳細資訊,請參閱「Microsoft Azure 免費試用」。
在方案總管中,以滑鼠右鍵按一下 AzureApp 專案。 選取發行。
如果您尚未登入 Azure 帳戶,請按一下「登入」。
登入後,選擇訂閱並點擊「下一步」。
輸入雲端服務的名稱並選擇區域。 按一下 [建立]。
按一下發行。