65.9K
CodeProject 正在变化。 阅读更多。
Home

在 .NET 4.5 中使用 WebSocket (第 1 部分)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.81/5 (21投票s)

2013年7月8日

CPOL

3分钟阅读

viewsIcon

242176

在本系列文章中,我将分享一些我最近在 .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 中提供的 WebSocketHandlerWebSocketHost

在客户端 Web 端,HTML 5 提供了 WebSocket API,而 jQuery 封装了这些 API 以方便使用。

如果我们要创建一个客户端应用程序,我们可以通过以下两种方式之一来实现

  • 使用 ClientWebSocket 类 (System.Net.WebSockets)。
  • 创建一个 WCF 客户端并引用支持 WebSocket 连接的 WCF 服务。

注意:我们只能在 Windows 8Windows 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 应该类似。

Click to enlarge image

您在测试 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:  

© . All rights reserved.