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

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (10投票s)

2013 年 7 月 16 日

CPOL

3分钟阅读

viewsIcon

116613

downloadIcon

7128

使用 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 一样。 我将在本文中简要介绍如何使用它。

背景

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;
    }
} 

EchoWSServiceWebSocketService 继承。 它实现了通信行为:

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

© . All rights reserved.