C# 网络客户端可以';t下载从写入到响应动态生成的文件

C# 网络客户端可以';t下载从写入到响应动态生成的文件,c#,excel,httpwebrequest,webclient,webclient-download,C#,Excel,Httpwebrequest,Webclient,Webclient Download,我正试图使用C#中的WebClient,编写一段代码来下载XLSX(Excel2007+)文件。问题是,尽管下面的(标准)代码可以从internet下载其他文件,但它无法下载此文件,该文件是由ASPX页面的响应动态生成的 这是我的密码: public bool Download(string url, string targetFileName, out DownloadFinalState finalState) { finalState = Downl

我正试图使用C#中的
WebClient
,编写一段代码来下载XLSX(Excel2007+)文件。问题是,尽管下面的(标准)代码可以从internet下载其他文件,但它无法下载此文件,该文件是由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(可公开获取):


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

是的,
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并设置请求的属性。

@Soner Gonul:您的编辑使我的问题从最新问题中消失。很明显,问题出在生成此文件的服务器上。它只是从中剥离一些字节。如果不显示生成文件的服务器端代码,很难提供帮助。通常这是由于没有正确处理一些IDisposable资源造成的。@DarinDimitrov:我自己提到过这个案例(它是在ASPX页面的响应中动态生成的)&这不是我的服务器,这是我想从中下载文件的服务器。谢谢Darin。几秒钟前,我意识到问题是关于gzip的,我解决了它。然而,您的答案确实正确,值得被选为正确答案。对于那些可能在此处检查问题的人:使用Fiddler查看内容是否从web服务器端被gziped,如果问题与我的类似,请使用@Darin告诉的方法,或在此处检查其他解决方案: