2017-03-09 310 views
2

我正在開發一個原型項目,它將在Mono上運行的自託管SignalR服務器與C#客戶端(用於測試)和Unity客戶端(代表實際使用 - 案例場景)。 Unity客戶端使用BestHTTP Pro作爲其SignalR庫。建立SSE連接後,SignalR服務器關閉與Unity客戶端的連接

由於Mono不支持WebSocket傳輸方法,因此我將重點放在服務器發送的事件上,並觀察其中非常奇怪的行爲。服務器和C#客戶端之間的通信正常運行。然而,對於Unity客戶端來說,在對/signalr/connect請求的初始響應之後立即關閉(應該是)持久連接。沒有錯誤報告在任何地方;兩種情況下的響應碼都是200。

Fiddler進一步的調查表明,統一客戶端發送一個Connection: Keep-Alive報頭,所述C#客戶端發送,向其中服務器以Connection: close頭響應的,那麼,關閉連接(換句話說,與客戶要求它做的完全相反)。

手動刪除保持活動請求標頭實際上使所有工作都與Unity客戶端一起工作。由於這感覺更像是一個奇怪的解決方法,而不是一個正確的解決方案,我的問題是:這是一個奇怪的服務器端行爲在SignalR庫中的錯誤?或者Mono可能會在這裏受到指責(我懷疑這可能是這種情況)?我怎樣才能更深入地瞭解這一點,並理想地使SSE運輸工作沒有客戶端黑客?

庫版本中使用:

作爲參考,這裏是完整的請求/響應頭;團結/ 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 
+0

服務器發回給統一客戶端的73個字節是多少?它可能是一個錯誤信息?順便說一句,keep-alive是默認的連接頭(如果我正確理解了https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Connection),所以我的預感會在服務器上出現問題(SignalR)方面。 –

+0

從命令行使用curl可能是測試SSE的好方法;你應該能夠構建不同的頭文件,並看看他們有什麼影響力。 –

+0

73個字節是SignalR響應(不是錯誤);在這兩種情況下都是相同的,因爲連接保持打開狀態,所以在其他情況下只有Content-Length報頭,即服務器開始發送時不知道響應長度。 是的,它看起來像一個服務器端問題 - 我基本上試圖找出哪個特定的組件導致它(SignalR,單聲道,別的?)。關於Curl的好主意,謝謝! – d0gb3r7

回答

1

BestHTTP開發商在這裏。

首先,插件可以在每個支持的平臺上使用WebSocket作爲SignalR傳輸。雖然Unity使用的單聲道框架沒有WebSocket實現,但插件使用它自己的。

服務器發送的事件協議並沒有直接指示應該如何處理這種情況,但修改了插件以與其他客戶端一樣工作。您可以等待Asset Store上的下一個版本,也可以聯繫我獲取更新的軟件包。

+0

感謝您的回答!由於在_server_端缺少WebSockets支持,我們被鎖定在SSE上(可能不完全清楚)。 由於平臺更改,此問題已經過時,因此我無法檢查新的BestHTTP版本是否已修復該問題;仍然很高興知道它保持得很好! :) – d0gb3r7

相關問題