我正在尝试使用OWIN / Katana编写websocket服务器。我按照此处列出的示例:http://aspnet.codeplex.com/sourcecontrol/latest#Samples/Katana/WebSocketSample/WebSocketServer/Startup.cs
现在我的客户端代码:
var connection = new WebSocket('ws://localhost:5000/game', 'kmud');
connection.onopen = function () {
connection.send('Ping');
};
我遇到的问题是,当执行此代码时,连接到达服务器就好了,服务器MOSTLY发回正确的东西,但是有一个问题:协议从服务器错了。它一直是空白的。
以下是请求:
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:no-cache
Connection:Upgrade
Host:localhost:5000
Origin:null
Pragma:no-cache
Sec-WebSocket-Extensions:permessage-deflate; client_max_window_bits
Sec-WebSocket-Key:7Q3r81ZhvtCSmbbUnVRUXA==
Sec-WebSocket-Protocol:kmud
Sec-WebSocket-Version:13
Upgrade:websocket
User-Agent:Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36
然后回复:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Server: Microsoft-HTTPAPI/2.0
Sec-WebSocket-Protocol:
Connection: Upgrade
Sec-WebSocket-Accept: u/0CCzacjw8KKJd0UjKW0xuJFU4=
Date: Thu, 12 Mar 2015 19:14:02 GMT
注意响应中的协议是空白的。我的浏览器遇到问题并抛出异常:
WebSocket connection to 'ws://localhost:5000/game' failed: Error during WebSocket handshake: 'Sec-WebSocket-Protocol' header value '' in response does not match any of sent values
所以我尝试了很多种不同的协议;包括'',null,' soap'和[' soap'' json'],但没有任何效果。每当我检查服务器中的上下文时,协议都会报告为一个包含空字符串的单个元素的数组。
我在这里做错了什么?
答案 0 :(得分:1)
在请求中,您有标题Sec-WebSocket-Protocol:kmud
。响应还需要包含此标头,其中只包含请求中的一个值(如果没有被识别或接受,则发送错误响应)。在这种情况下,请求只有一个选项,因此它应该是一个简单的选择:)