【问题标题】:HttpWebResponse is wrong for the ContentLengthHttpWebResponse 的 ContentLength 错误
【发布时间】:2016-09-18 17:25:07
【问题描述】:

我有一个 HTTP 协议的下载方法。但它似乎无法正常工作,出了点问题。我用一些 url 源对其进行了测试,除了最后一个之外它是正确的。 url 的 ContentLength 属性错误。它在运行时显示为 210 kb,但实际上是 8 MB。我将通过分享我的代码来展示它。如何解决?

代码:

    void TestMethod(string fileUrl)
    {
        HttpWebRequest req = WebRequest.Create(fileUrl) as HttpWebRequest;
        HttpWebResponse resp = req.GetResponse() as HttpWebResponse;
        long contentSize = resp.ContentLength;

        MessageBox.Show(contentSize.ToString());
    }
    private void TestButton_Click(object sender, EventArgs e)
    {
        string url1 = "http://www.calprog.com/Sounds/NealMorseDowney_audiosample.mp3";
        string url2 = "http://www.stephaniequinn.com/Music/Canon.mp3";

        TestMethod(url1); //This file size must be 8 MB, but it shows up as 210 kb. This is the problem

        TestMethod(url2); //This file size is correct here, about 2.1 MB 
    }

【问题讨论】:

    标签: c# http download content-length


    【解决方案1】:

    我认为您不允许以这种方式访问​​此 url(使用 HttpWebRequest)。

    如果您尝试获取响应文本:

        HttpWebRequest req = WebRequest.Create(fileUrl) as HttpWebRequest;
        HttpWebResponse resp = req.GetResponse() as HttpWebResponse;
        using (var streamreader = new StreamReader(resp.GetResponseStream()))
        {
            var r = streamreader.ReadToEnd();
            long contentSize = r.Length;
            Console.WriteLine(contentSize.ToString());
        }
    

    你会得到这样的回应:

    <html><head><title>Request Rejected</title></head><body>The requested URL was rejected. If you think this is an error, please contact the webmaster. <br><br>Your support ID is: 2719994757208255263</body></html>
    

    您必须设置 UserAgent 才能获得完整响应。像这样:

    req.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0";
    

    通过设置这个值,服务器会认为你的程序是一个 Firefox 浏览器。

    所以这几行代码应该可以解决问题:

       void TestMethod(string fileUrl)
       {
           HttpWebRequest req = WebRequest.Create(fileUrl) as HttpWebRequest;
           req.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0";
           HttpWebResponse resp = req.GetResponse() as HttpWebResponse;
           long contentSize = resp.ContentLength;
           Console.WriteLine(contentSize.ToString());
        }
    

    祝你有美好的一天!

    【讨论】:

    • 它工作正常。我不喜欢使用StreamReader,因为它会等待文件被下载。设置UserAgent更好,可以返回正确的大小。最后,这个 Mozilla UserAgent 是否适用于所有 Http 源?因为我需要它被概括。谢谢@Quentin。
    • 是的,此用户代理将适用于所有 http 源。 (如果可以使用标准浏览器访问该 url)
    • 感谢先生的快速回复!很好的回答
    猜你喜欢
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 2011-06-18
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多