我正在開發一個原型項目,它將在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
服務器發回給統一客戶端的73個字節是多少?它可能是一個錯誤信息?順便說一句,keep-alive是默認的連接頭(如果我正確理解了https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Connection),所以我的預感會在服務器上出現問題(SignalR)方面。 –
從命令行使用curl可能是測試SSE的好方法;你應該能夠構建不同的頭文件,並看看他們有什麼影響力。 –
73個字節是SignalR響應(不是錯誤);在這兩種情況下都是相同的,因爲連接保持打開狀態,所以在其他情況下只有Content-Length報頭,即服務器開始發送時不知道響應長度。 是的,它看起來像一個服務器端問題 - 我基本上試圖找出哪個特定的組件導致它(SignalR,單聲道,別的?)。關於Curl的好主意,謝謝! – d0gb3r7