WebClient无法下载从写入到响应即时生成的文件

时间:2013-11-24 13:44:08

标签: c# excel httpwebrequest webclient webclient-download

我正在尝试使用C#中的WebClient编写代码来下载XLSX(Excel 2007+)文件。问题是,虽然以下(标准)代码可以从互联网上下载其他文件,但它无法下载此文件,该文件是从ASPX页面的响应中即时生成的。

这是我的代码:

public bool Download(string url, string targetFileName, out DownloadFinalState finalState)
        {
            finalState = DownloadFinalState.InitialState;
            try
            {
                Random rnd = new Random();
                string fname = Directory.GetCurrentDirectory() + "\\" + rnd.Next(10000, 99999) + targetFileName;
                WebClient Client = new WebClient();

                var ua = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)";
                Client.Headers.Add(HttpRequestHeader.UserAgent, ua);
                Client.DownloadFile(url, fname);

                if (File.Exists(fname))
                {
                    finalState = DownloadFinalState.FileDownloadedSuccessfully;
                }
                else
                {
                    finalState = DownloadFinalState.NoExceptionButNoFile;
                }
                return true;
            }
            catch (Exception ex)
            {
                finalState = DownloadFinalState.ExceptionRaised;
                return false;
            }
        }

以下是文件的URL(可公开获取): http://www.tsetmc.com/tsev2/excel/MarketWatchPlus.aspx?d=0

我还尝试在标头中删除代理,并尝试基于HttpWebRequest的方法,但它们都没有工作。在上述代码的情况下,文件的下载量比实际文件小4KB,并且是一种奇怪的不可读(对于MS Excel)格式。

1 个答案:

答案 0 :(得分:1)

是的,这似乎是WebClient.DownloadFile方法的问题。尝试以下方法,它对我很有用:

class Program
{
    static void Main()
    {
        var request = (HttpWebRequest)WebRequest.Create("http://www.tsetmc.com/tsev2/excel/MarketWatchPlus.aspx?d=0");
        request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
        request.Headers[HttpRequestHeader.AcceptEncoding] = "gzip,deflate";
        using (var response = request.GetResponse())
        using (var stream = response.GetResponseStream())
        using (var output = File.Create("test.xlsx"))
        {
            stream.CopyTo(output);
        }
    }
}

我能够在Excel中成功打开下载的文件。在这个例子中,我已经在请求中指定了解压缩方法。也可以使用WebClient完成,但您需要编写自定义WebClient并在请求上设置属性。