我使用Tcp-Listner Tcp-Client连接在C#.Net Framework上创建简单的Web服务器。
现在我正在尝试为聊天\或其他功能提供Websocket连接的支持。
对于套接字,请使用GenericHandler和js进行连接。得到客户的请求后
GET /socket/SocketHandler.ashx HTTP/1.1
Host: ***************
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36
Upgrade: websocket
Origin: http://************
Sec-WebSocket-Version: 13
Accept-Encoding: gzip, deflate
Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7
Sec-WebSocket-Key: aroK0T3g3A6oSxC6Qz1QDg==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
使用连接键 aroK0T3g3A6oSxC6Qz1QDg == 从服务器向客户端发送响应,将其SHA1哈希并转换为Base64格式以获取接受键 zGccDw / PeOtlWAmdPT6HBtyywYc = < / p>
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: zGccDw/PeOtlWAmdPT6HBtyywYc=
Sec-WebSocket-Protocol: chat
但是之后,客户(浏览器)说
失败:WebSocket握手期间错误:不正确 “ Sec-WebSocket-Accept”标头值
那么,什么是即时消息做错了以及如何解决?
upd:例如,我使用此代码进行转换
string ClientKey = socketKey;
string GUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
var conc = ClientKey + GUID;
var buffer = Encoding.UTF8.GetBytes(conc);
var hash1 = SHA1.Create().ComputeHash(buffer);
var AcceptKey = System.Convert.ToBase64String(hash1);
答案 0 :(得分:1)
我在C#中也有自己的WebSocket客户端。并且它已经过测试并且可以与ASP.NET Core一起使用。
然后,我测试了您的安全密钥,结果有所不同。我低于哈希值。
QCd+628gwEVYxyYQ8ekJny8ZHCo=
这是我的安全密钥生成部分。
const string handshakeMagic = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
string handshakeSecureKey = "aroK0T3g3A6oSxC6Qz1QDg==";
string handshakeResponseKey;
using (SHA1Managed sha1 = new SHA1Managed())
{
byte[] handshakeResponseBytes = Encoding.ASCII.GetBytes(handshakeSecureKey + handshakeMagic);
byte[] sha1Bytes = sha1.ComputeHash(handshakeResponseBytes);
handshakeResponseKey = Convert.ToBase64String(sha1Bytes);
}
Console.WriteLine(handshakeResponseKey);
与您的几乎一样。