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/11757107011524818642HTTP/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 文档网站。
本文翻译自:
Windows Azure 网站上的 WebSocket 简介的更多相关文章
- 在 Windows Azure 网站上使用 Django、Python 和 MySQL:创建博客应用程序
编辑人员注释:本文章由 Windows Azure 网站团队的项目经理 Sunitha Muthukrishna 撰写. 根据您编写的应用程序,Windows Azure 网站上的基本Python 堆 ...
- Windows Azure 网站上的 WordPress 3.8
编辑人员注释:本文章由 Windows Azure 网站团队的项目经理 Sunitha Muthukrishna 和 Windows Azure 网站开发人员体验合作伙伴共同撰写. WordPr ...
- 删除 Windows Azure 网站上的标准服务器头
编辑人员注释: 本文章由 Windows Azure 网站团队的项目经理 Erez Benari 撰写. 请求和响应中包含的 HTTP 头是Web 服务器和浏览器之间的 HTTP 通信过程的一部分.例 ...
- 在 Windows Azure 网站 (WAWS) 上对 Orchard CMS 使用 Azure 缓存
编辑人员注释: 本文章由 Windows Azure 网站团队的项目经理 Sunitha Muthukrishna 撰写. 如果您当前的 OrchardCMS 网站在 Windows Azure 网站 ...
- Windows Azure 网站:应用程序字符串和连接字符串的工作原理
编辑人员注释:本文章由 Windows Azure 网站团队的首席项目经理 Stefan Schackow 撰写. Windows Azure 网站上有一个方便的功能,即开发人员可将 Azure 中的 ...
- Windows Azure 网站 (WAWS) 中的服务器端包含 (SSI)
编辑人员注释:本文章由 Windows Azure 网站团队的项目经理Erez Benari 撰写. Windows Azure 网站客户普遍关心的一个问题是关于我们对服务器端包含(Server ...
- 使用 IIS Manager 对 Windows Azure 网站进行远程管理
最近,我们为客户新增了使用 Windows自带的 IIS管理控制台管理 Azure网站的功能.IIS Manager支持 HTTP over SSL,提供到您的 Windows Azure 网站 ...
- 最佳实践:Windows Azure 网站 (WAWS)
编辑人员注释:本文章由 Windows Azure 网站团队的项目经理Sunitha Muthukrishna 撰写. Windows Azure 网站 (WAWS) 允许您在 Windows ...
- 进一步探索:Windows Azure 网站中解锁的配置选项
编辑人员注释: 本文章由 Windows Azure 网站团队的项目经理 Erez Benari 撰写. 在 Windows Azure 网站 (WAWS) 中管理网站时,许多选项可使用 Azu ...
随机推荐
- Android应用开发基础篇(14)-----自定义标题栏
一.概述 每一个应用程序默认的标题栏(注意与状态栏的区别)只有一行文字(新建工程时的名字),而且颜色.大小等都是固定的,给人的感觉比较单调.但当程序需要美化的时候,那么修改标题栏是就是其中一项内容,虽 ...
- LCM Cardinality
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=31675#problem/E 暴力 // File Name: uva10892.cpp ...
- 极客Web前端开发资源大荟萃
前端开发已经成为当前炙手可热的技术之中的一个.本周我们除了给大家带技术相关资讯,另一些技术人员经常使用的站点.希望大家不要错过我们本周的内容.原文来自:极客标签 为神马说敲代码是非常艰难的 程序猿 做 ...
- 嵌入式系统 Boot Loader
基于嵌入式系统中的 OS 启动加载程序 ―― Boot Loader 的概念.软件设计的主要任务以及结构框架等内容.
- 在CG/HLSL中访问着色器属性(Properties)
在CG/HLSL中访问着色器属性 Shader在Properties块中访问材质属性.如果你想在一个着色程序中访问一些属性,你需要声明一个Cg/HLSL具有相同的名称和一个匹配的类型的变量. Prop ...
- JS学习之prototype属性
javascript中的每个对象都有prototype属性,Javascript中对象的prototype属性的解释是:返回对象类型原型的引用.以A.prototype = new B();为例, 理 ...
- 清除缓存、开启IO统计
SQL性能优化前期准备-清除缓存.开启IO统计 如果需要进行SQl Server下的SQL性能优化,需要准备以下内容: 一.SQL查询分析器设置: 1.开启实际执行计划跟踪. 2.每次执行需优化SQL ...
- 捕捉小括号获取的内容保存在RegExp的$1 $2..属性中
~~~~捕捉小括号获取的内容保存在RegExp的$1 $2..属性中 var reg=/^(-?\d+)(px|pt|em|in)?$/;if(reg.test(svalue)){ ...
- 手机SIM卡知识大科普
SIM卡 SIM卡是(Subscriber Identity Module 客户识别模块)的缩写,也称为智能卡.用户身份识别卡,GSM数字移动电话机必须装上此卡方能使用.它在一电脑芯片上存储了数字移动 ...
- C++中的内存对齐
在我们的程序中,数据结构还有变量等等都需要占有内存,在很多系统中,它都要求内存分配的时候要对齐,这样做的好处就是可以提高访问内存的速度. 我们还是先来看一段简单的程序: 程序一 1 #include ...