【发布时间】:2015-07-23 19:53:25
【问题描述】:
服务器:支持 WebSocket 的 Windows Server 2012
客户端 1:Windows 8.1
客户端机器 2: Windows Server 2008R2
我使用 SigalR 客户端构建了一个 C# 应用程序,我可以在我的两台客户端计算机上进行 delpoy。但是,我遇到的问题是 Client Machine 1 使用 WebSockets 连接,而 Client Machine 2 使用服务器端事件连接。
怎么会这样?显然服务器支持 WebSockets,因为Client Machine 1 可以使用它们进行连接。我不明白Client Machine 2 将如何使用 SSE。
在我的客户端上使用hub.TraceLevel = TraceLevels.All;,我看到了:
20:57:01.5805156 - null - ChangeState(Disconnected, Connecting)
20:57:02.1117656 - 7ff6f37a-2485-4f08-9c20-872f63964bee - WS Connecting to: wss://internal.soroco.com/signalr/connect?clientProtocol=1.4&transport=webSockets&connectionData=[{"Name":"ClientDaemonHub"}]&connectionToken=Mvbkw1czN7OZSE1jcfFjC2elxYxJhZiTZwisKKn6ZzYv%2BXRjOgfkclRJdSQtPi2wy%2F7XsUyxbCEXPMesFjvE7zh0FrcGwEsh6WTpHlkqB0rXyARnC42Op8ZO3w%2FhuKcB
20:57:02.1273906 - 7ff6f37a-2485-4f08-9c20-872f63964bee - Auto: Failed to connect to using transport webSockets. System.PlatformNotSupportedException: The WebSocket protocol is not supported on this platform.
at System.Net.WebSockets.ClientWebSocket..ctor()
at Microsoft.AspNet.SignalR.Client.Transports.WebSocketTransport.<PerformConnect>d__1.MoveNext()
20:57:02.1273906 - 7ff6f37a-2485-4f08-9c20-872f63964bee - SSE: GET https://internal.soroco.com/signalr/connect?clientProtocol=1.4&transport=serverSentEvents&connectionData=[{"Name":"ClientDaemonHub"}]&connectionToken=Mvbkw1czN7OZSE1jcfFjC2elxYxJhZiTZwisKKn6ZzYv%2BXRjOgfkclRJdSQtPi2wy%2F7XsUyxbCEXPMesFjvE7zh0FrcGwEsh6WTpHlkqB0rXyARnC42Op8ZO3w%2FhuKcB
20:57:02.1430156 - 7ff6f37a-2485-4f08-9c20-872f63964bee - SSE: OnMessage(Data: initialized)
20:57:02.1430156 - 7ff6f37a-2485-4f08-9c20-872f63964bee - SSE: OnMessage(Data: {"C":"d-752B7883-B,0|I,0|J,1","S":1,"M":[]})
20:57:02.4086406 - 7ff6f37a-2485-4f08-9c20-872f63964bee - ChangeState(Connecting, Connected)
20:57:03.5180156 - 7ff6f37a-2485-4f08-9c20-872f63964bee - OnMessage({"R":"497ca302-7375-4250-aa85-fb4ae2556877","I":"0"})
20:57:03.8461406 - 7ff6f37a-2485-4f08-9c20-872f63964bee - OnMessage({"I":"1"})
20:57:04.7523906 - 7ff6f37a-2485-4f08-9c20-872f63964bee - SSE: OnMessage(Data: {})
20:57:05.7523906 - 7ff6f37a-2485-4f08-9c20-872f63964bee - OnMessage({"I":"2"})
20:57:07.7367656 - 7ff6f37a-2485-4f08-9c20-872f63964bee - OnMessage({"I":"3"})
看起来相关的错误是:
自动:无法使用传输 webSockets 连接。 System.PlatformNotSupportedException:此平台不支持 WebSocket 协议。
【问题讨论】:
-
您正在构建 Windows 商店应用程序吗?
-
那么 webosckets 应该可以工作,假设你没有做 PCL(便携式类库)。打开日志记录,您应该会看到发生了什么。您还可以使用以下技巧确保服务器确实支持 websockets - 在您的浏览器中请求以下页面 localhost:9999/signalr/negotiate(显然将 localhost:9999 替换为您的主机)并检查响应(它将是 JSon)是否包含 @ 987654329@.
-
服务器肯定启用了 WebSockets,因为当我在 Windows 8.1 机器上运行我的 C# 应用程序时,它通过 WebSockets 连接。但是,当我在 Windows Server 2008R2 上运行相同的应用程序时,它使用服务器发送事件进行连接。我需要阅读 PCL 并尝试启用日志记录。谢谢!
-
@Pawel 我在客户端上添加了跟踪输出。
-
您提供的日志是在连接开始之后。传输选择发生在此之前。我不记得在这方面客户端日志有多广泛,但在最坏的情况下,您还应该能够使用 fiddler 来跟踪线路上发生的事情。我写了一篇关于 SignalR 协议 blog.3d-logic.com/2015/03/29/… 的帖子,您看到的问题发生在连接启动时(请参阅帖子中的启动顺序),因此您需要查看那里的某个地方。