我正在尝试创建一个C#Web套接字服务器 - 我知道这是一个重新发明的轮子,但它更多的是编码练习而不是现实应用程序。
我已经创建了Listener并且能够接收请求,我已经阅读了websockets的规范,并设法为握手设置了初始标头,但我似乎无法设置“Connection”标头?
这是我在收到请求时使用的代码,并验证它是一个新的websocket升级握手;
string wsGuid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
string retCon = ctx.Request.Headers["Sec-WebSocket-Key"] + wsGuid;
Console.WriteLine("Upgrade, key recieved: " + ctx.Request.Headers["Sec-WebSocket-Key"]);
System.Security.Cryptography.SHA1 s = new System.Security.Cryptography.SHA1CryptoServiceProvider();
byte[] retBy = s.ComputeHash(Encoding.ASCII.GetBytes(retCon));
string retStr = Convert.ToBase64String(retBy);
Console.WriteLine("Return string: " + retStr);
ctx.Response.Headers.Add("Sec-WebSocket-Accept", retStr);
ctx.Response.Headers.Add("Access-Control-Allow-Origin", "*");
ctx.Response.Headers.Add("Upgrade", "WebSocket");
ctx.Response.Headers.Add("Connection", "Upgrade");
ctx.Response.StatusCode = 101;
ctx.Response.OutputStream.Flush();
ctx.Response.OutputStream.Close();
这很好用,但是当我尝试在运行chrome的javascript中打开websocket连接时,我得到了错误
WebSocket connection to 'ws://localhost:4455/' failed: Error during WebSocket handshake: 'Connection' header is missing
在检查Fiddler中的响应头时,我可以看到响应看起来像这样;
HTTP/1.1 101 Switching Protocols
Upgrade: WebSocket
Content-Length: 0
Server: Microsoft-HTTPAPI/2.0
Sec-WebSocket-Accept: k3N0odnsp2f9eanXsFN7EILQExo=
Access-Control-Allow-Origin: *
Date: Mon, 17 Aug 2015 12:30:05 GMT
EndTime: 13:30:05.865
ReceivedBytes: 0
SentBytes: 0
当然实际上缺少Connection标头,即使我指定将其添加到C#代码中?这里发生了什么,我添加了错误的标题,还是我无法使用此方法修改Connection标头?
任何帮助都将不胜感激,谢谢。