Windows Azure 网站上的 WebSocket 简介

编辑人员注释: 本文章由 Windows Azure 网站团队的首席项目经理 Stefan Schackow 撰写。

Windows Azure 网站最近新增了对 WebSocket 协议的支持。.NET 开发人员和 node.js 开发人员现在可在其应用程序中启用 WebSocket 并加以利用。

网站的 Configuration 选项卡上有一个新的选项,用于为应用程序提供 WebSocket 支持。

为网站启用 WebSocket 后,ASP.NET(v4.5 及更高版本)和 node.js 开发人员便可将各自框架的库和 API 与 WebSocket 配合使用。

ASP.NET SignalR 聊天示例

SignalR 是一个用于构建实时 Web 应用程序的开源 .NET 库,这些 Web 应用程序需要实时 HTTP 连接才能传输数据。我们提供了一个很棒的站点,其中包含有关 SignalR 库的介绍性文章和详细信息。

由于 SignalR 本身支持将 WebSocket 作为协议,因此 SignalR 是在 Windows Azure 网站上运行连网 Web 应用程序的绝佳选择。例如,您可以在 Windows Azure 网站上运行此示例聊天应用程序

以下快照显示了 SignalR 聊天示例的结构:

在 Windows Azure 网站中创建 Web 应用程序、为应用程序启用 WebSocket 并上传 SignalR 聊天示例之后,即可在 Windows Azure 网站上运行自己专属的迷你聊天室!

Fiddler 的原始 HTTP 跟踪(如下所示)显示了 SignalR 客户端发送的 WebSocket 协议升级请求如何与 Web 服务器协商 WebSocket 连接:

Request snippet:

GET

 https://sigr-chat-on-waws.xxxx.net/signalr/connect?transport=webSocketssnip HTTP/1.1

Origin:https://sigr-chat-on-waws.xxxx.net

Sec-WebSocket-Key:hv2icF/iR1gvF3h+WKBZIw==

Connection:Upgrade

Upgrade:Websocket

Sec-WebSocket-Version:13

Response snippet:

HTTP/1.1 101 Switching Protocols

Upgrade:Websocket

Server:Microsoft-IIS/8.0

X-Content-Type-Options:nosniff

X-Powered-By:ASP.NET

Sec-WebSocket-Accept:Zb4I6w0esmTDHM2nSpndA+noIvc=

Connection:Upgrade

要了解有关利用 SignalR 构建实时 Web 应用程序的更多信息,请参阅 SignalR 概述网站上的扩展教程

ASP.NET Echo 示例

ASP.NET 自 .NET Framework v4.5 起即为 WebSocket 提供支持。开发人员通常希望使用更高级别的库(如 SignalR),以封装管理 WebSocket 连接的低级别详细信息。但是,对于勇于探索的开发人员,本节显示了一个在 ASP.NET 中使用低级别 WebSocket 支持的简短示例。

ASP.NET Echo 示例项目包含一个可侦听并响应 WebSocket 的服务器端 .ashx 处理程序和一个可建立 WebSocket 连接并将文本发送到服务器的简单 HTML 页面。

.ashx 处理程序可侦听 WebSocket 连接请求:

.ashx 处理程序可侦听 WebSocket 连接请求:

建立 WebSocket 连接后,处理程序会将文本返回到浏览器:

对应的 HTML 页面将在加载页面时建立 WebSocket 连接。当浏览器用户通过 WebSocket 连接发送文本时,ASP.NET 会返回输入的文本。

 

以下快照显示了一个浏览器会话,返回了输入的文本然后关闭WebSocket 连接。

Node.js 基本聊天示例

Node.js 开发人员对于使用 socket.io 库编写需要长时间运行的 HTTP 连接的网页非常熟悉。socket.io 支持将 WebSocket(及其他选项)作为网络协议,并且可将其配置为使用 WebSocket 进行传输(如果可用)。

Node.js 应用程序应该包括 socket.io 模块,然后在代码中配置socket:

如下所示的示例代码可侦听要使用昵称(例如聊天处理)连接的客户端,并将聊天消息广播到当前连接的所有客户端。

在 web.config 中,使用 WebSocket 的 node.js 应用程序需要进行以下小调整:

该web.config 条目将关闭 IIS WebSocket 支持模块 (iiswsock.dll),因为 node.js 不需要此模块。IIS 上的 nodej.js 包括自己的低级别 WebSocket 实现,这正是需要关闭 IIS 支持模块的原因所在。

但请记住,仍需使用本文先前所示的 UI 中的 Configuration 门户选项卡为您的网站启用 WebSocket 功能。

如果两个客户端均已连接并且已使用示例 node.js 应用程序交换消息,HTML 输出将如下所示:

Fiddler 的原始 HTTP 跟踪(如下所示)显示了 socket.io 客户端发送的 WebSocket 协议升级请求如何与 Web 服务器协商 WebSocket 连接:

Request snippet:

GET
https://abc123.azurewebsites.net/socket.io/1/websocket/11757107011524818642
HTTP/1.1

Origin:https://abc123.azurewebsites.net

Sec-WebSocket-Key:rncnx5pFjLGDxytcDkRgZg==

Connection:Upgrade

Upgrade:Websocket

Sec-WebSocket-Version:13

Response snippet:

HTTP/1.1 101 Switching Protocols

Upgrade:Websocket

Server:Microsoft-IIS/8.0

X-Powered-By:ASP.NET

Sec-WebSocket-Accept:jIxAr5XJsk8rxjUZkadPWL9ztWE=

Connection:Upgrade

WebSocket 连接限制

当前,Azure 网站已对每个运行的网站实例支持的并发 WebSocket 连接数实施限制。每种伸缩模式下每个网站实例支持的 WebSocket 连接数如下所示:

  • 免费:每个网站实例支持 (5) 个并发连接
  • 共享:每个网站实例支持 (35) 个并发连接
  • 标准:每个网站实例支持 (350) 个并发连接

如果您的应用程序试图打开超过允许限制的 WebSocket 连接,Windows Azure 网站将返回 503 HTTP 错误状态代码。

注意:术语“网站实例”指的是,如果您的网站调整为在 (2) 个实例上运行,则计为 (2) 个运行的网站实例。

您可能需要对 WebSocket 使用 SSL

当使用 WebSocket 时,开发人员需要牢记一点。WebSocket 协议依赖于某些不常用的 HTTP 头,尤其是Upgrade头,因此中间网络设备(如 Web 代理)将这些头剔除并不足为奇。最终的结果通常让开发人员灰心丧气且满腹疑问:WebSocket 应用程序为何不运行,或不选择 WebSocket,却反而选择了效率更低的替代解决方案。

解决此问题的窍门是通过 SSL 建立 WebSocket 连接。要完成此操作,请执行以下两个步骤:

  • 针对 WebSocket 端点使用 wss:// 协议标识符。例如,不要连接到 ws://mytestapp.azurewebsites.net(通过 HTTP 的 WebSocket),而要连接到 wss:// mytestapp.azurewebsites.net(通过 HTTPS 的 WebSocket)。
  • (可选)同时通过 SSL 运行使用WebSocket的页面。有时不需要执行此操作,但根据您使用的客户端框架,对包含 HTML 页面的 SSL 设置可能会使 WebSocket 连接具备 SSL 功能。

Windows Azure 网站通过使用 *.azurewebsites.net 的默认 SSL 证书为 SSL 提供支持,甚至包括在免费站点上。因此,您无需配置自己的 SSL 证书来解决此问题。对于 azurewebsites.net 下的 WebSocket 端点,您只需要切换为使用 SSL,此时将自动使用 *.azurewebsites.net 通配符 SSL 证书。

您还可以为网站注册自定义域,然后配置站点的 SNI 证书或基于 IP 的 SSL 证书。有关配置自定义域以及 Windows Azure 网站的 SSL 证书的详细信息,请参考 Windows Azure 文档网站。

本文翻译自:

https://blogs.msdn.com/b/windowsazure/archive/2013/11/14/introduction-to-websockets-on-windows-azure-web-sites.aspx