在 C# 中创建 Websocket 服务器的最简单方法是什么?

Sca*_*bas 4 c# websocket

有人正在为我们构建原生聊天应用程序,而 Websockets 似乎是实现应用程序和我们的服务器(使用 Web API)之间同步的方式。

我们研究了 SignalR,但它似乎需要 jQuery,因此在本机应用程序中会很麻烦。

是否有一种“纯粹”且简单的方法可以在 C# 中使用可扩展的 Websockets?通过“简单”,我的意思是像开始使用 Web API 一样简单(我见过一些例子,你必须创建一个 TCP 侦听器并遵守最新的 RFC 规范等 - 在我看来并不简单),并且通过“可扩展”我的意思是不阻塞线程。

编辑:问题标题重命名以放大 websocket 服务器实现的重要性

The*_*rst 5

SignalR 非常适合以下情况:

1) 如果 websockets 不可用,您需要回退

2)您可以控制客户端的实现(客户端必须遵循特定的协议)

我能想到的最简单的方法是Microsoft.WebSockets,从你告诉我们的项目(客户端实现的有限控制,仅 websocket 服务器实现,Web API)。

您可以从 NuGet安装Microsoft.WebSockets,并在几分钟内启动并运行 websocket 服务器。那里有一些教程(例如:https : //dejanstojanovic.net/aspnet/2014/june/database-change-notifications-in-aspnet-using-websocket/),但本质上:

1) 确保您的 IIS 启用了 websockets

2) 创建一个处理 websocket 请求的 Web API 控制器。前任。:

using System;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Http;
using Microsoft.Web.WebSockets;

public class SomeController : ApiController
{
    // Has to be called something starting with "Get"
    public HttpResponseMessage Get()
    {
        HttpContext.Current.AcceptWebSocketRequest(new SomeWebSocketHandler());
        return Request.CreateResponse(HttpStatusCode.SwitchingProtocols);
    }

    class SomeWebSocketHandler : WebSocketHandler
    {
        public SomeWebSocketHandler() { SetupNotifier(); }
        protected void SetupNotifier()
        {
            // Call a method to handle whichever change you want to broadcast
            var messageToBroadcast = "Hello world";
            broadcast(messageToBroadcast);
        }

        private static WebSocketCollection _someClients = new WebSocketCollection();

        public override void OnOpen()
        {
            _someClients.Add(this);
        }

        public override void OnMessage(string message)
        {

        }

        private void broadcast(string message)
        {
            _someClients.Broadcast(msg);
            SetupNotifier();
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

SetupNotifier()方法应包含捕获您要对其做出反应的更改的逻辑。broadcast(string message)(当然可以重命名)包含将数据“返回”给客户端的逻辑 - 此示例向所有客户端发送相同的消息。

确保使用适当的 websocket 客户端对此进行测试(如果您想要易用性,可以使用 Chrome 扩展) - 您不能ws://按原样在浏览器中执行请求。