0

我正在使用 C# 中的 Sockets 练习 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。但是,我这样做是出于学习目的。

斯文

4

3 回答 3

2

您不可能只接收 HTTP 响应正文,Socket.Receive()将接收服务器已发送的所有可用字节,因此响应标头也必须存在(如果您正在与通用 Web 服务器通信并已发出有效请求)。使用Fiddler之类的工具来监控请求-响应对并检查响应是否以HTTP/1.1 200 OK.

您可以调用Receive(),直到收到一个 double \r\n,这表明所有标头都已发送。从那里开始,您必须实施RFC 2616 第 4.4 节以确定要读取多少(如果有)消息正文数据。

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

但如果是出于学习目的,您应该已经找到了 RFC 并实现了它。你不能只是去读取数据并希望它会很好,这就是协议的用途。

于 2012-07-25T15:02:00.353 回答
0

您的 while 循环将永远不会执行,因为 'bytes' 最初为零并且它仅在它为正时循环。

于 2012-07-26T02:16:07.907 回答
0

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

于 2012-07-26T03:42:20.090 回答