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库,您可能想试一试:)(但它没有客户端)。我建议您先测试几个库的性能和可扩展性,然后再选择一个;)