【问题标题】:SignalR client on Windows Server 2008R2 using Server Sent EventsWindows Server 2008R2 上的 SignalR 客户端使用服务器发送事件
【发布时间】: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/… 的帖子,您看到的问题发生在连接启动时(请参阅帖子中的启动顺序),因此您需要查看那里的某个地方。

标签: websocket signalr


【解决方案1】:

NET Framework 4.5 on Win7 和 Win2008 R2 doesn't support the ClientWebSocket class 这就是 SignalR 客户端用于 websocket 传输的内容。由于使用 websocket 失败,客户端会退回到 ServerSentEvents。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 2012-05-08
    • 2014-11-22
    • 2014-08-12
    • 2021-11-26
    • 1970-01-01
    相关资源
    最近更新 更多