使用 Azure 服务总线的 SignalR 横向扩展
警告
本文档不适用于最新版本的 SignalR。 查看 ASP.NET Core SignalR。
在本教程中,你将使用服务总线底板将 SignalR 应用程序部署到 Windows Azure Web 角色,以便将消息分发到每个角色实例。 (还可以将服务总线底板与 Azure 应用服务.) 中的 Web 应用配合使用
先决条件:
- 一个 Microsoft Azure 帐户。
- Windows Azure SDK。
- Visual Studio 2012 或 2013。
服务总线底板还与 适用于 Windows Server 的服务总线版本 1.1 兼容。 但是,它与适用于 Windows Server 的服务总线版本 1.0 不兼容。
定价
服务总线底板使用主题发送消息。 有关最新定价信息,请参阅 服务总线。 撰写本文时,每月可以发送 1,000,000 条消息,且不超过 1 美元。 底板会针对每次调用 SignalR 中心方法发送服务总线消息。 还有一些用于连接、断开连接、加入或离开组等的控制消息。 在大多数应用程序中,大多数消息流量将是中心方法调用。
概述
在开始详细教程之前,下面简要概述了你将执行的操作。
使用 Windows Azure 门户创建新的服务总线命名空间。
将这些 NuGet 包添加到应用程序:
创建 SignalR 应用程序。
将以下代码添加到 Startup.cs 以配置底板:
public void Configuration(IAppBuilder app) { string connectionString = "Service Bus connection string"; GlobalHost.DependencyResolver.UseServiceBus(connectionString, "YourAppName"); app.MapSignalR(); // ... }
此代码使用 TopicCount 和 MaxQueueLength 的默认值配置底板。 有关更改这些值的信息,请参阅 SignalR 性能:横向扩展指标。
对于每个应用程序,为“YourAppName”选择不同的值。 不要在多个应用程序中使用相同的值。
创建 Azure 服务
创建云服务,如 如何创建和部署云服务中所述。 按照“如何:使用快速创建创建云服务”部分中的步骤进行操作。 在本教程中,无需上传证书。
创建新的服务总线命名空间,如 如何使用服务总线主题/订阅中所述。 按照“创建服务命名空间”部分中的步骤进行操作。
注意
请确保为云服务和服务总线命名空间选择同一区域。
创建 Visual Studio 项目
启动 Visual Studio。 在“ 文件 ”菜单中,单击“ 新建项目”。
在“ 新建项目 ”对话框中,展开 “Visual C#”。 在 “已安装的模板”下,选择“ 云 ”,然后选择“ Windows Azure 云服务”。 保持默认值 .NET Framework 4.5。 将应用程序命名为 ChatService,然后单击“ 确定”。
在 “新建 Windows Azure 云服务 ”对话框中,选择“ASP.NET Web 角色”。 单击) (> 右箭头按钮,将角色添加到解决方案。
将鼠标悬停在新角色上,使铅笔图标可见。 单击此图标可重命名角色。 将角色命名为“SignalRChat”,然后单击“ 确定”。
在 “新建 ASP.NET 项目 ”对话框中,选择“ MVC”,然后单击“确定”。
项目向导创建两个项目:
- ChatService:此项目是 Windows Azure 应用程序。 它定义 Azure 角色和其他配置选项。
- SignalRChat:此项目是 ASP.NET MVC 5 项目。
创建 SignalR 聊天应用程序
若要创建聊天应用程序,请按照使用 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
在解决方案资源管理器中,展开 ChatService 项目中的“角色”文件夹。
右键单击 SignalRChat 角色,然后选择 “属性”。 选择“ 配置 ”选项卡。在 “实例” 下,选择“2”。 还可以将 VM 大小设置为 “特小”。
保存更改。
在解决方案资源管理器中,右键单击 ChatService 项目。 选择“发布”。
如果这是你第一次发布到 Windows Azure,则必须下载凭据。 在 “发布 ”向导中,单击“登录以下载凭据”。 这会提示登录 Windows Azure 门户并下载发布设置文件。
单击“ 导入 ”并选择下载的发布设置文件。
单击“下一步” 。 在 “发布设置” 对话框中的“ 云服务”下,选择之前创建的云服务。
单击“发布” 。 部署应用程序和启动 VM 可能需要几分钟时间。
现在,运行聊天应用程序时,角色实例使用服务总线主题通过Azure 服务总线进行通信。 主题是允许多个订阅者的消息队列。
底板会自动创建主题和订阅。 若要查看订阅和消息活动,请打开Azure 门户,选择服务总线命名空间,然后单击“主题”。
消息活动需要几分钟时间才会显示在仪表板中。
SignalR 管理主题生存期。 只要部署了应用程序,就不要尝试手动删除主题或更改主题的设置。
疑难解答
System.InvalidOperationException“唯一支持的 IsolationLevel 是'IsolationLevel.Serializable'。”
如果操作的事务级别设置为 以外的 Serializable
值,则会发生此错误。 验证是否未对其他事务级别执行任何操作。