在 .NET 4.5 中使用 WebSocket (第 4 部分)
使用 Microsoft.WebSockets.dll 的 WebSocket。
引言
第 1 部分 概述了 WebSocket 协议和 .NET WebSocket 支持。第 2 部分 演示了如何在传统的 ASP.NET 和 MVC 4 Web 应用程序中使用 WebSocket。第 3 部分 演示了如何使用 WCF 托管 WebSocket 服务并与其通信,还提供了使用 JavaScript WebSocket API 调用 WebSocket WCF 服务的解决方案。
除了上述解决方案之外,微软还发布了一个实用程序程序集,它有助于使用 .NET 服务器端 WebSocket API,就像使用基于事件的 JavaScript WebSocket API 一样。 我将在本文中简要介绍如何使用它。
- MSWSChat.zip 是在 ASP.NET 中托管的示例。
- MSWcfWSChat.zip 是作为 WCF 服务托管的示例。
背景
Microsoft.WebSockets.dll 最初发布用于封装 .NET WebSocket API 并帮助人们轻松使用它们。 该包装器使通信 基于事件。 它支持二进制 (byte[]
) 和文本消息。 请注意,命名空间是 Microsoft.Web.WebSockets
。 它与程序集名称略有不同。
您可以通过 Visual Studio 2012 中的 NuGet 下载它。 只需右键单击您的项目即可打开上下文菜单,然后单击 管理 NuGet 程序包。然后您可以搜索并下载 Microsoft.WebSockets 程序包,如下图所示:
有关更多信息,请参阅 https://nuget.net.cn/packages/Microsoft.WebSockets/0.2.3.
准备
要启用服务器端的 WebSocket,请参阅 第 1 部分.
在 ASP.NET 中托管
要在 ASP.NET 中托管 WebSocket 服务器,我首先编写一个从 WebSocketHandler
继承的类:
public class MyWSHandler : WebSocketHandler
{
public override void OnOpen()
{
this.Send("Welcom from " + this.WebSocketContext.UserHostAddress);
}
public override void OnMessage(string message)
{
string msgBack = string.Format(
"You have sent {0} at {1}", message, DateTime.Now.ToLongTimeString());
this.Send(msgBack);
}
public override void OnClose()
{
base.OnClose();
}
public override void OnError()
{
base.OnError();
}
}
然后我在自定义 HTTP 处理程序中使用 MyWSHandler
:
public class MSWSChatHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
if (context.IsWebSocketRequest || context.IsWebSocketRequestUpgrading)
{
context.AcceptWebSocketRequest(new MyWSHandler());
}
}
public bool IsReusable
{
get
{
return false;
}
}
}
不要忘记像我在 第 2 部分 中所做的那样在 Web.config 中注册自定义 HTTP 处理程序。 代码比 第 2 部分 简单得多且更易于阅读,对吧? 当然,您可以在 MVC 4 Web 应用程序中使用相同的方式。 客户端代码与 第 2 部分 几乎相同。 请参考附件。
作为 WCF 服务托管
WebSocketHost
用于将 WebSocket 服务器作为 WCF 服务托管。 您可以在 IIS 和主机应用程序中使用它。 在这里我想在 IIS 中托管它,所以我编写了一个主机工厂 - MyWebSocketServiceFactory
:
public class MyWebSocketServiceFactory : ServiceHostFactory
{
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
WebSocketHost host = new WebSocketHost(serviceType, baseAddresses);
host.AddWebSocketEndpoint();
return host;
}
}
EchoWSService
从 WebSocketService
继承。 它实现了通信行为:
public class EchoWSService : WebSocketService
{
public override void OnOpen()
{
this.Send("Welcome!");
}
public override void OnMessage(string message)
{
string msgBack = string.Format(
"You have sent {0} at {1}", message, DateTime.Now.ToLongTimeString());
this.Send(msgBack);
}
protected override void OnClose()
{
base.OnClose();
}
protected override void OnError()
{
base.OnError();
}
}
然后我将 MyWebSocketServiceFactory
注册为 Global.asax 中的 RouteTable
条目:
public class Global : System.Web.HttpApplication
{
protected void Application_Start(object sender, EventArgs e)
{
RouteTable.Routes.Add(new ServiceRoute(
"Echo", new MyWebSocketServiceFactory(), typeof(EchoWSService)));
}
}
以便 URL 类似于“ws:///MSWcfWSChat/Echo”的请求将被视为 WebSocket 连接请求。
我们唯一需要在 Web.config 中做的事情是确保 aspNetCompatibilityEnabled
设置为 true:
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
</system.serviceModel>
客户端代码与 第 2 部分 几乎相同,除了 URL。
总结
Microsoft.WebSockets.dll 非常易于使用。 但是,它不是微软的官方版本。 上次更新是在 2012 年 6 月完成的。 我希望将来能持续支持它。
相关链接
在 .NET 4.5 中使用 WebSocket