在 .NET 4.5 中使用 WebSocket (第 1 部分)
在本系列文章中,我将分享一些我最近在 .NET 4.5 中使用 WebSocket 时学到的知识。
引言
在本系列文章中,我将分享一些我最近在 .NET 4.5 中使用 WebSocket 时学到的知识。
协议概述
WebSocket 协议由 IETF 标准化为 RFC 6455。我们可以在 维基百科 和 W3C 上找到介绍和更多信息。
WebSocket 连接通过客户端和服务器之间的 HTTP 握手建立(前缀为 "ws://
" 或 "wss://
")。例如(来自 维基百科),客户端发送一个请求
GET /mychat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat
Sec-WebSocket-Version: 13
Origin: http://example.com
然后服务器发送一个响应来接受连接
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
"Sec-WebSocket-Key
" 和 "Sec-WebSocket-Accept
" 用于通过密钥验证算法确认客户端和服务器之间的连接。
"Sec-WebSocket-Version
" 由客户端用于告诉服务器客户端端支持的协议版本。标准中不需要向后兼容性。如果客户端指定的版本不受服务器支持,服务器可以通过此标头发送版本列表。“13”(1.3)是 WebSocket 的一个里程碑版本。
"Sec-WebSocket-Protocol
" 用于确认连接的自定义子协议。这使得既可以从客户端选择子协议,也可以确保服务器同意服务该子协议。
有关该协议的更多详细信息,请参阅 RFC 6455。
.NET 中的 WebSocket
Microsoft .NET 4.5 提供了几种使用 WebSocket 的方法。
在服务器端,我们可以通过以下任何一种方式托管我们的 WebSocket 服务器
- 使用
HttpContext.AcceptWebSocketRequest
- 使用
CallbackContract
和新的netHttpBinding
创建一个 WCF 服务 - 使用 Microsoft.WebSockets.dll 中提供的
WebSocketHandler
或WebSocketHost
在客户端 Web 端,HTML 5 提供了 WebSocket API,而 jQuery 封装了这些 API 以方便使用。
如果我们要创建一个客户端应用程序,我们可以通过以下两种方式之一来实现
- 使用
ClientWebSocket
类 (System.Net.WebSockets
)。 - 创建一个 WCF 客户端并引用支持 WebSocket 连接的 WCF 服务。
注意:我们只能在 Windows 8、Windows Server 2012 及以上版本上使用 .NET WebSocket,包括服务器端和客户端应用程序。并且 Web 服务器必须是 IIS 8 及以上版本。目前,包含在 Visual Studio 2012 中的 IIS 8 Express
不支持 WebSocket。我希望 Microsoft 将在未来添加支持。
HTML 5 WebSocket API 在操作系统平台上没有限制。唯一的限制是浏览器版本。Internet Explorer 从 IE 10 开始支持 HTML 5 WebSocket。
准备工作
要在服务器端启用 WebSocket,您需要在 IIS 8 上安装 WebSocket 协议。在 Windows Server 2012 上,您可以通过 服务器管理器 -> 管理 -> 添加角色和功能 来实现。展开 Web 服务器 (IIS) 角色,并选中 Web 服务器 -> 应用程序开发 -> WebSocket 协议。您可能会被要求安装依赖项,只需允许它们即可。然后安装所有您的选择。Windows 8 应该类似。
您在测试 WebSocket 应用程序时可能会遇到一个异常。该异常说
"Could not load type ‘System.ServiceModel.Activation.HttpModule’
from assembly 'System.ServiceModel, Version=3.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089'"
请参阅 这篇文章 了解解决方案。
摘要
接下来在 第 2 部分,我将演示如何在传统的 ASP.NET 或 MVC 4 Web 应用程序中使用 HttpContext.AcceptWebSocketRequest
。
相关链接
在 .NET 4.5 中使用 WebSocket: