C# HTTP套接字:响应头

C# HTTP套接字:响应头,c#,http,sockets,header,C#,Http,Sockets,Header,我正在使用C#中的套接字练习HTTP,并且我能够使用以下代码获得响应正文: int bytes = 0; while (bytes > 0) { bytes = HttpSocket.Receive(RecieveBytes, RecieveBytes.Length, 0); Response.Body = Response.Body + Encoding.ASCII.GetString(RecieveBytes, 0, bytes); } 当我阅读Response.Bo

我正在使用C#中的套接字练习HTTP,并且我能够使用以下代码获得响应正文:

int bytes = 0;
while (bytes > 0)
{
    bytes = HttpSocket.Receive(RecieveBytes, RecieveBytes.Length, 0);
    Response.Body = Response.Body + Encoding.ASCII.GetString(RecieveBytes, 0, bytes);
}
当我阅读Response.Body时,它只包含HTML代码。(身体)

我如何获得更多信息?比如响应标题?我已经在谷歌上搜索过了,但没有明确的答案

注意:我知道在C#中为HTTP创建类或框架没有意义,因为我们有HttpWebRequest。然而,我这样做是为了学习


Swen

您不可能只接收HTTP响应正文,
Socket.Receive()
将接收服务器发送的所有可用字节,因此响应头也必须在那里(如果您正在与普通web服务器对话并发出了有效请求)。使用类似于监视请求-响应对的工具,并检查响应是否以HTTP/1.1 200 OK开始

您可以调用
Receive()
,直到您收到一个双精度
\r\n
,该双精度
\r\n
指示所有标头都已发送。从那时起,您必须实现以确定要读取多少(如果有的话)消息体数据

最常见的是
内容长度
响应头,它指示在双
\r\n
之后应该读取多少字节。如果该标头不存在(或者如果您的请求方法是
HEAD
,在这种情况下,您应该停止读取,因为不会有消息正文),并且其他方法都不适用,那么此时您已经完成了数据读取,您不应该尝试
接收()


但是如果是为了学习,你应该找到RFC并实现它。你不能只是去读取数据,然后希望它会好起来,这就是协议的用途。

你的while循环永远不会执行,因为“bytes”最初是零,它只在它为正时循环。

这不是处理HTTP的最佳方法。
Socket
类对原始字节进行操作,但HTTP头对文本行进行操作。您需要在循环中读取文本行,直到遇到空行,然后处理标题以决定如何完成剩余原始字节(如果有)的读取。请查看
NetworkStream
StreamReader
类。更好的选择是使用
HttpClient
client类,让它为您处理所有这些细节。

因此,我应该将“字节”转换为字符串,然后HTTP响应头应该在那里。
Content Length
头不是检测消息结束的唯一方法。HTTP定义了几种不同的方法来实现这一点,但并不是所有的方法都是基于头的。阅读RFC 2616第4.4节了解详情。@RemyLebeau你是对的,虽然我在回答中已经有点半机智地提到了这一点,但我已经澄清了这一部分。这里没有“原始套接字”。你在上面有好几层。