【问题标题】:How to get only headers with HTTP GET request without fetching the body如何仅获取带有 HTTP GET 请求的标头而不获取正文
【发布时间】:2017-11-01 09:37:42
【问题描述】:

是否有机会发出 http 获取请求、读取标头而不获取正文以减少流量并提高速度? 我使用此代码:

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(u1);
        request.AllowAutoRedirect = true;
        request.Timeout = 30000;
        request.Method = "GET";
        request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36";
        request.KeepAlive = true;
        HttpWebResponse response;

        using (response = (HttpWebResponse)request.GetResponse())
        {
            var res = response.ResponseUri.ToString();
        }

所以我只需要结果 url。如果有重定向(位置标头) - 我将获得结果 url。但我不需要身体。用 GET 方法(不是 HEAD 方法)得到响应来得到没有响应体的结果是真的吗?

【问题讨论】:

  • 您应该了解HEAD 请求。响应正文(至少部分)已经在使用GET 的路上。您可以忽略它,但它仍然会出现并且会消耗不必要的带宽。
  • @spender 也是一个好点,尽管读取标头然后断开连接可能会避免大多数正文(如果正文足够大)实际在线路上传输。这肯定是一个不好的做法和hacky。
  • @LB2 :断开连接也有隐藏的成本。它破坏了 HTTP 1.1 流水线,并且当您真的在搞砸事情时,在 TIME_WAIT 期间无法重用端口,这可能导致端口耗尽。
  • @spender - 同意。这正是我所说的不良做法的意思。放弃连接以避免流量是一个坏主意。这就是为什么发表评论以帮助防止其他人提出这个想法。

标签: c# http


【解决方案1】:

在返回正文的资源上使用GET 意味着您想要获取正文。 HEAD 专为您所寻求的而设计,假设服务器资源支持它。

如果服务器不支持HEAD,您可能会使用Range header 来请求几个字节,但这也取决于支持它的资源,并且是一种黑客攻击。

【讨论】:

    【解决方案2】:

    你可以使用HttpRequest的Headers属性

    response.Headers
    

    获取响应的标头。

    【讨论】:

    • 这让你阅读 OP 已经在做的标题。这不会阻止身体被转移以减少流量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 2022-01-23
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 2018-08-08
    相关资源
    最近更新 更多