我使用system.net.socket监听端口。客户端通过XDomainRequest(IE9)发送请求,套接字处理其请求并将响应发送回去。
现在,我通过两个步骤发送响应。首先,我发送这样的标题:
string httpHeaders = "HTTP/1.1" + "\r\n";
httpHeaders += "Cache-Control: no-cache" + "\r\n";
httpHeaders += "Access-Control-Allow-Origin: *";
httpHeaders += "\r\n\r\n";
byte[] byteHttpHeaders = System.Text.Encoding.UTF8.GetBytes(httpHeaders);
handler.BeginSend(byteHttpHeaders, 0, byteHttpHeaders.Length, 0, new AsyncCallback(SendCallback), handler);
然后我发送数据的另一部分,像这样:
byte[] byteData= System.Text.Encoding.UTF8.GetBytes("Hello");
handler.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), handler);
但是这种方式似乎并不好。很少有客户无法获得响应,当我查看日志时,我看到他仅收到 header 。
我试图用blockcopy连接两个字节数组,并一次发送 header 和其他数据。但是不幸的是,这是行不通的。我无法通过这种方式将任何内容发送给客户端。我以这种方式使用块复制:
byte[] concat = new byte[byteHttpHeaders.Length + byteData.Length];
System.Buffer.BlockCopy(byteHttpHeaders, 0, concat, 0, byteHttpHeaders.Length);
System.Buffer.BlockCopy(byteData, 0, concat, byteHttpHeaders.Length, byteData.Length);
handler.BeginSend(concat, 0, concat.Length, 0, new AsyncCallback(SendCallback), handler);
我可以一次发送所有数据吗?最好的方法是什么?
谢谢
最佳答案
我怀疑您是通过BeginSend
发送两次(一次头,一次是正文),而第二次BeginSend
发生在第一个BeginSend
完成之前。如果您这样做:行为是不确定的(您违反了预期的用法)。预计您一次只能进行一个出站异步操作。如果您的代码不允许这样做:不要使用async:只需使用Send
即可。使用任何异步套接字API都需要大量的计划和对细节的关注。
关于c# - 在system.net.socket中将HTTP header 发送到客户端的实际方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29580788/