http - 建立 SSE 连接后,SignalR 服务器立即关闭与 Unity 客户端的连接

标签 http unity3d mono signalr server-sent-events

我正在开发一个原型(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/

相关文章:

python - 在 Selenium 中捕获流量

Android HTTP 请求奇怪的 404 未找到问题

http - 指示 "not logged in"的正确 HTTP 代码是什么?

objective-c - NSTextView 中的上下文菜单

http - Google clientLogin 身份验证 url 响应 - 302 文档已移动

c# - 将网格转换为图表以进行导航

android - Unity GoogleMobileAdsMediationTestSuite 抛出异常 setAdListener 必须在主 UI 线程上调用

parsing - 解析错误Unity 3D

c# - 您会相信 Mono 作为建立初创公司的平台吗?

c# - "ignoring"P/Invoke 在 Mono 上运行时