允许SignalR与第三方WebSockets服务器集成所需的内容



2部分问题

  1. 我是否正确地实现了此客户端
  2. 如果我要实现我自己的WebSockets服务器,我对允许SignalR的传输协商过程识别WebSockets并能够使用它进行通信有什么要求

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

  • Windows 7
  • 框架4.5
  • Owin自托管(控制台)SignalR服务器
  • Owin自托管(控制台).NET客户端
  • Web客户端(Javascript)

第1部分:尝试使用System.Net.WebSockets.ClientWebSocket客户端实现Katana示例

因此,我正在构建一个自托管SignalR进程,我在我的fiddler流量中注意到,我的连接正在使用LongPolling,而我更喜欢它使用WebSockets,所以我开始研究使WebSockets可用所需的内容。

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

一些消息来源指出,该限制仅适用于希望使用HTTP.sys的各方,并且自托管解决方案可以使用WebSockets:Katana示例WebSocket服务器Katana示例WebSocket客户端

因此,我开始将Katana示例(我有一个SignalR服务器,我想通过WebSockets、.NET客户端和Web客户端公开它)实现到我的SignalR server中,当我尝试在.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();
                }
            }

        }

Connect()函数内的行

ClientWebSocket websocket = new System.Net.WebSockets.ClientWebSocket();

投掷

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.WebSockets命名空间创建WebSocket客户端,这是否达到了一个硬性限制?

第2部分:调查第三方WebSocket服务器/客户端的含义

假设第1部分中的代码是死胡同,我想我的下一个可行的选择是用适当的客户端(如SignalR.Client.WebSocket4Net)实现第三方Web套接字服务器(如SuperWebSocket),并公开套接字服务器供SignalR使用。我希望答案是"什么都没有。它只会起作用",但一旦我站起来SuperWebSocket并扩展我的CLR客户端以实现SignalR.Client.WebSocket4Net,SignalR通信协商升级请求并开始通过ws://传输需要什么?


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

第1部分

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

为什么ClientWebSockets在Windows7上不起作用?好吧,这根本没有意义,但服务器和客户端之间可能有一些共享功能,这就是它在"中被阻止的原因;旧的";使用CCD_ 1。

第2部分

您可能需要实现自己的ITransport来创建自己的WebSocketTransport,并将其注册到TransportManager中。这纯粹是猜测,我从未尝试过这样做:)只是,要警惕你能找到的关于这件事的少量文档或经验。。。

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

我的0.02

为什么选择SignalR?这是一种很快就不需要的聚乙烯填充物。WebSockets是一种标准的、广泛支持的技术,并且很容易在旧浏览器中使用websocket-js进行聚合填充。SignalR只适用于广播一般数据的应用程序(请查看限制部分)。我编写并维护了一个名为WebSocketListener的WebSocket库,您可能想试一试:)(但它没有客户端)。我建议您先测试几个库的性能和可扩展性,然后再选择一个;)

相关内容

  • 没有找到相关文章

最新更新