我正在开发一个原型(prototype)项目,将在 Mono 上运行的自托管 SignalR 服务器与 C# 客户端(用于测试)和 Unity 客户端(代表实际用例场景)连接起来。 Unity 客户端正在使用 BestHTTP Pro作为其 SignalR 库。
由于 Mono 不支持 WebSocket 传输方法,因此我专注于服务器发送的事件,并在那里观察到非常奇怪的行为。服务器和 C# 客户端之间的通信开箱即用。但是,对于 Unity 客户端,(假设)持久连接在对 /signalr/connect
请求的初始响应后立即关闭。任何地方都不报错;在这两种情况下,响应代码都是 200。
进一步调查 Fiddler显示 Unity 客户端正在发送 C# 客户端不发送的 Connection: Keep-Alive
header ,服务器响应 Connection: close
header ,然后关闭连接(换句话说,与客户端要求它做的完全相反)。
手动删除 keep-alive 请求 header 实际上可以让 Unity 客户端一切正常。由于这感觉更像是一种奇怪的解决方法而不是正确的解决方案,所以我的问题是:这种奇怪的服务器端行为是 SignalR 库中的错误吗?或者 Mono 应该归咎于此(我怀疑可能是这种情况)?我如何才能更深入地研究这一点,并理想地使 SSE 传输在没有客户端黑客攻击的情况下正常工作?
使用的库版本:
作为引用,这里是完整的请求/响应 header ; Unity/BestHTTP 客户端:
GET /signalr/connect?tid=1&_=XXX&transport=serverSentEvents&clientProtocol=1.5&connectionToken=XXX&connectionData=XXX HTTP/1.1
Accept: text/event-stream
Cache-Control: no-cache
Accept-Encoding: identity
Host: XXX
Connection: Keep-Alive
Connection: Keep-Alive, TE
TE: identity
User-Agent: BestHTTP
HTTP/1.1 200 OK
X-Content-Type-Options: nosniff
Content-Type: text/event-stream
Server: Mono-HTTPAPI/1.0
Date: Wed, 08 Mar 2017 10:34:05 GMT
Connection: close
Content-Length: 73
C# 客户端:
GET /signalr/connect?clientProtocol=1.4&transport=serverSentEvents&connectionData=XXX&connectionToken=XXX HTTP/1.1
User-Agent: SignalR.Client.NET45/2.2.1.0 (Microsoft Windows NT 6.2.9200.0)
Accept: text/event-stream
Host: XXX
HTTP/1.1 200 OK
X-Content-Type-Options: nosniff
Content-Type: text/event-stream
Server: Mono-HTTPAPI/1.0
Date: Wed, 08 Mar 2017 13:11:16 GMT
Transfer-Encoding: chunked
Keep-Alive: timeout=15,max=99
最佳答案
这里是最佳 HTTP 开发人员。
首先,该插件可以在每个支持的平台上使用 WebSocket 作为 SignalR 传输。虽然 Unity 使用的 mono 框架没有 WebSocket 实现,但该插件使用它自己的框架。
Server-Sent Events 协议(protocol)没有直接指示对于这种情况应该做什么,而是修改了插件使其以与其他客户端相同的方式工作。您可以等待 Asset Store 上的下一个版本,或者您可以联系我获取更新包。
关于http - 建立 SSE 连接后,SignalR 服务器立即关闭与 Unity 客户端的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42698849/