使用 Azure 服務匯流排的 SignalR 向外延展

作者: Patrick Fletcher

警告

本檔不適用於最新版的 SignalR。 請查看ASP.NET Core SignalR

在本教學課程中,您將使用服務匯流排幕後程式將 SignalR 應用程式部署到 Windows Azure Web 角色,以將訊息散發至每個角色實例。 (您也可以在 Azure App Service.) 中搭配 Web 應用程式使用服務匯流排後板

顯示從主題到 Web 角色到電腦的箭號的圖表。標示為發行的箭號會從 Web 角色開始,並移至主題。

先決條件:

服務匯流排背板也與 Windows Server 1.1 版 的服務匯流排相容。 不過,它與 Windows Server 服務匯流排 1.0 版不相容。

定價

服務匯流排背板會使用主題來傳送訊息。 如需最新的定價資訊,請參閱 服務匯流排。 在撰寫本文時,您可以每月傳送 1,000,000 則訊息,少於 $1。 背板會針對 SignalR 中樞方法的每個調用傳送服務匯流排訊息。 也有一些控制訊息可用於連線、中斷連線、聯結或離開群組等等。 在大部分的應用程式中,大部分的訊息流量都會是中樞方法調用。

概觀

在我們進入詳細的教學課程之前,以下是您將執行的快速概觀。

  1. 使用 Windows Azure 入口網站建立新的服務匯流排命名空間。

  2. 將這些 NuGet 套件新增至您的應用程式:

  3. 建立 SignalR 應用程式。

  4. 將下列程式碼新增至 Startup.cs 以設定背板:

    public void Configuration(IAppBuilder app)
    {
        string connectionString = "Service Bus connection string";
        GlobalHost.DependencyResolver.UseServiceBus(connectionString, "YourAppName");
    
        app.MapSignalR();
        // ...
    }
    

此程式碼會使用 TopicCountMaxQueueLength的預設值來設定背板。 如需變更這些值的資訊,請參閱 SignalR 效能:向外延展計量

針對每個應用程式,針對 「YourAppName」 挑選不同的值。 請勿在多個應用程式之間使用相同的值。

建立 Azure 服務

建立雲端服務,如 如何建立和部署雲端服務中所述。 Follow the steps in the section "How to: Create a cloud service using Quick Create". 在本教學課程中,您不需要上傳憑證。

[雲端服務] 選項的螢幕擷取畫面,以紅色圓圈顯示。

建立新的服務匯流排命名空間,如 如何使用服務匯流排主題/訂用帳戶中所述。 請遵循一節中的步驟。

標題為的視窗螢幕擷取畫面,其中新增了下列選項的新命名空間。

注意

請務必為雲端服務和服務匯流排命名空間選取相同的區域。

建立 Visual Studio 專案

啟動 Visual Studio。 從 [檔案] 功能表,按一下 [新增專案]

在 [ 新增專案] 對話方塊中,展開 [Visual C#]。 在 [已安裝的範本] 底下,選取 [ 雲端 ],然後選取 [Windows Azure 雲端服務]。 保留預設.NET Framework 4.5。 將應用程式命名為 ChatService,然後按一下 [ 確定]。

顯示 [新增專案] 對話方塊的螢幕擷取畫面。[Office 共用點] 資料夾中已選取 [雲端]。聊天服務位於 [名稱] 欄位中。

在 [ 新增 Windows Azure 雲端服務 ] 對話方塊中,選取 [ASP.NET Web 角色]。 按一下向右鍵按鈕 (>) ,將角色新增至您的解決方案。

將滑鼠停留在新角色上,讓鉛筆圖示可見。 按一下此圖示以重新命名角色。 將角色命名為 「SignalRChat」,然後按一下 [ 確定]。

顯示 [新增 Windows Azure 雲端服務] 對話方塊的螢幕擷取畫面。訊號 R 聊天輸入在 S P 點 NET Web 角色上方。

在 [ 新增 ASP.NET 專案 ] 對話方塊中,選取 [MVC],然後按一下 [確定]。

顯示 [新增 S P 點 NET 專案] 對話方塊的螢幕擷取畫面。M V C 是選取的範本。

專案精靈會建立兩個專案:

  • ChatService:此專案是 Windows Azure 應用程式。 它會定義 Azure 角色和其他組態選項。
  • SignalRChat:此專案是您 ASP.NET MVC 5 專案。

建立 SignalR Chat 應用程式

若要建立聊天應用程式,請遵循 開始使用 SignalR 和 MVC 5教學課程中的步驟。

使用 NuGet 來安裝必要的程式庫。 從 [ 工具 ] 功能表中,選取 [NuGet 套件管理員],然後選取 [ 套件管理員主控台]。 在 [ 套件管理員主控台] 視窗中,輸入下列命令:

Install-Package -ProjectName SignalRChat Microsoft.AspNet.SignalR
Install-Package -ProjectName SignalRChat Microsoft.AspNet.SignalR.ServiceBus

-ProjectName使用 選項將套件安裝到 ASP.NET MVC 專案,而不是 Windows Azure 專案。

設定背板

在應用程式的 Startup.cs 檔案中,新增下列程式碼:

public void Configuration(IAppBuilder app)
{
    // Any connection or hub wire up and configuration should go here
    string connectionString = "";
    GlobalHost.DependencyResolver.UseServiceBus(connectionString, "Chat");  

    app.MapSignalR();
}

現在您需要取得服務匯流排連接字串。 在 Azure 入口網站中,選取您建立的服務匯流排命名空間,然後按一下 [存取金鑰] 圖示。

此螢幕擷取畫面顯示加號標示為 [建立]、標示為 [存取金鑰] 的金鑰,以及標示為 [刪除] 的垃圾桶。

將連接字串複製到剪貼簿,然後將它貼到 connectionString 變數中。

顯示 [存取金鑰連線至命名空間] 對話方塊的螢幕擷取畫面。

string connectionString = "Endpoint=sb://xxxx.servicebus.windows.net/;
SharedSecretIssuer=owner;SharedSecretValue=XXXXXXXX";

部署至 Azure

在 [Solution Explorer] 中,展開 ChatService 專案內的 [角色] 資料夾。

顯示標題為 Roles 之開啟資料夾的螢幕擷取畫面。已選取 [訊號 R 聊天]。

以滑鼠右鍵按一下 SignalRChat 角色,然後選取 [ 屬性]。 選取 [ 組態] 索引標籤。在 [實例] 底 下,選取 [2]。 您也可以將 VM 大小設定為 [額外小型]。

顯示實例的螢幕擷取畫面。實例計數設定為 2,V M 大小設定為 [額外小]。

儲存變更。

在 Solution Explorer 中,以滑鼠右鍵按一下 ChatService 專案。 選取 [發佈]。

顯示Solution Explorer的螢幕擷取畫面。[聊天服務] 操作功能表中已選取 [發佈]。

如果這是您第一次發佈至 Windows Azure,您必須下載認證。 在 [ 發佈 精靈] 中,按一下 [登入以下載認證]。 這會提示您登入 Windows Azure 入口網站,並下載發佈設定檔。

顯示 [發佈 Windows Azure 應用程式] 對話方塊的螢幕擷取畫面。登入以下載認證會以紅色圓圈。

按一下 [匯 入],然後選取您下載的發佈設定檔。

按一下 [下一步] 。 在 [ 發佈設定] 對話方塊的 [ 雲端服務] 底下,選取您稍早建立的雲端服務。

顯示 [Windows Azure 發佈設定] 頁面的螢幕擷取畫面。

按一下 [發佈]。 部署應用程式並啟動 VM 可能需要幾分鐘的時間。

現在當您執行聊天應用程式時,角色實例會使用服務匯流排主題透過 Azure 服務匯流排進行通訊。 主題是允許多個訂閱者的訊息佇列。

背板會自動建立主題和訂用帳戶。 若要查看訂用帳戶和訊息活動,請開啟 Azure 入口網站,選取服務匯流排命名空間,然後按一下 [主題]。

導覽功能表的螢幕擷取畫面,其中已選取主題。

訊息活動需要幾分鐘的時間才會顯示在儀表板中。

顯示時程表上訂用帳戶和訊息活動的圖表螢幕擷取畫面。

SignalR 會管理主題存留期。 只要部署您的應用程式,請勿嘗試手動刪除主題或變更主題上的設定。

疑難排解

System.InvalidOperationException「唯一支援的 IsolationLevel 是 'IsolationLevel.Serializable'」。

如果作業的交易層級設定為 以外的 Serializable 專案,就會發生此錯誤。 確認其他交易層級未執行任何作業。