允许Signal与第三方WebSockets服务器集成需要什么? 第二部分问题 我是否正确地实现了这个客户端? 如果我要实现自己的WebSockets服务器,我对允许信号机的传输协商过程识别WebSockets并能够将其用于通信的要求是什么?

允许Signal与第三方WebSockets服务器集成需要什么? 第二部分问题 我是否正确地实现了这个客户端? 如果我要实现自己的WebSockets服务器,我对允许信号机的传输协商过程识别WebSockets并能够将其用于通信的要求是什么?,websocket,signalr,owin,katana,websocket4net,Websocket,Signalr,Owin,Katana,Websocket4net,请注意,我的技术限制目前涉及 视窗7, 框架4.5, Owin自托管解决方案信号服务器, Owin自助式解决方案.NET客户端, Web客户端Javascript 第1部分:尝试使用System.Net.WebSocket.ClientWebSocket客户端实现Katana示例 因此,我正在构建一个自托管信号器流程,我在fiddler流量中注意到,我的连接使用的是LongPolling,而我更喜欢使用WebSocket,因此我开始研究使WebSocket可用所需的内容 一些快速的研究得出了混杂

请注意,我的技术限制目前涉及

视窗7, 框架4.5, Owin自托管解决方案信号服务器, Owin自助式解决方案.NET客户端, Web客户端Javascript 第1部分:尝试使用System.Net.WebSocket.ClientWebSocket客户端实现Katana示例 因此,我正在构建一个自托管信号器流程,我在fiddler流量中注意到,我的连接使用的是LongPolling,而我更喜欢使用WebSocket,因此我开始研究使WebSocket可用所需的内容

一些快速的研究得出了混杂的信息: 一些消息来源指出,WebSockets仅在Windows 8和IIS 8上可用,并且WebSockets实现是在操作系统级别集成的

一些消息来源指出,该限制仅适用于希望使用HTTP.sys的各方,并且自托管解决方案可以利用WebSocket:

因此,我开始实施Katana示例—我有一个信号服务器,我想通过WebSockets、一个.NET客户端和一个Web客户端将其公开到我的信号服务器中—当我尝试在.NET客户端中执行以下代码时,截取客户端代码中当前不相关的部分:

static void Main(string[] args)
        {
            Console.WriteLine("╔════════════════════════════════════════════════════════════════════════════╗");
            Console.WriteLine("╠»»»-                     Starting Service.Host-                   «««╣");

            Console.WriteLine("║-- Connecting to Client Messaging Hub-- ");
            Console.WriteLine("║.....Attempting to upgrade to WebSockets ");

            //UseDefaultConnectionParameters();
            Connect("ws://localhost:8080");

            Console.WriteLine(String.Format("║-->Connection Established [{0}]", @"ws://localhost:8080"));
            Console.WriteLine("╠»»»                   Service.Host now  started                   «««╣");
            Console.WriteLine("╚════════════════════════════════════════════════════════════════════════════╝");
            Console.ReadLine();

        }
        private static async Task Connect(string uri)
        {
            ClientWebSocket websocket = null;
            try
            {
                websocket = new ClientWebSocket();//<= Throws exception
                await websocket.ConnectAsync(new Uri(uri), CancellationToken.None);
                await Task.WhenAll(Receive(websocket), Send(websocket));
            }
            catch(Exception ex)
            {
                Console.WriteLine("Exception: {0}", ex);
            }
            finally
            {
                if (websocket != null)
                    websocket.Dispose();
                Console.WriteLine();

                lock(master)
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("WebSocket closed.");
                    Console.ResetColor();
                }
            }


        }
投掷

Exception: System.PlatformNotSupportedException: The WebSocket protocol is not s
upported on this platform.
   at System.Net.WebSockets.ClientWebSocket..ctor().  
我的CLR客户端库以.NET Framework 4.5为目标

这是否遇到了一个硬限制,即在没有Windows 8的情况下,您实际上无法从System.Net.WebSocket命名空间创建WebSocket客户端

第2部分:调查第三方WebSocket服务器/客户端的含义 假设第1部分中的代码是一条死胡同,我想我的下一个可行的选择是实现第三方Web套接字服务器,例如使用适当的客户端,例如,并公开套接字服务器,供Signal使用。我希望答案不会是什么。它只会起作用,但一旦我启动SuperWebSocket并扩展我的CLR客户端以实现SignalR.Client.WebSocket4Net,需要什么让SignalR communications协商升级请求并开始通过ws://

有人能在这两条道路上提供任何指导吗?如果我选择了错误的路线,我预计会浪费很多时间。

第一部分 Windows 8和2012中发布的新版本http.sys负责将常规http请求转换为持久、二进制、双向TCP连接,即WebSocket。这就是在建立websocket连接时允许IIS切换协议的原因

为什么ClientWebSocket不能在Windows 7上工作?好吧,这一点都没有意义,但服务器和客户端之间可能存在一些共享功能,这就是为什么它在使用PlatformNotSupportedException的旧操作系统中被阻止的原因

第二部分 您可能需要实现自己的来创建自己的,并在中注册它。这纯粹是猜测,我从未尝试过这样做:只是,对你能找到的关于这方面的小文档或经验要小心

但是问题来了,如果您的客户端切换到另一个传输,它将失败!由于操作系统无法在同一端口侦听长轮询和WebSocket,因此对WebSocket组件的常规HTTP请求将不会产生任何影响。这就是http.sys在其新版本中的技巧,侦听http常规请求,如果需要,仍然可以在websocket上打开其中一个请求

我的0.02 为什么是信号员?这是一种不会很快被需要的多填料。WebSockets是一种标准的、受广泛支持的技术,很容易在旧浏览器中使用。信号员正在检查限制部分。我编写并维护了一个,您可能想尝试一下:它没有客户端。我建议您在选择一个库之前测试几个库的性能和可伸缩性

Exception: System.PlatformNotSupportedException: The WebSocket protocol is not s
upported on this platform.
   at System.Net.WebSockets.ClientWebSocket..ctor().