2013-11-24 29 views
0

我试图编写一个代码,通过在C#中使用WebClient来下载XLSX(Excel 2007+)文件。问题是,虽然下面的(标准)代码可以从互联网上下载其他文件,但它不能下载这个文件,它是从ASPX页面的响应中动态生成的。WebClient无法下载生成的文件从写入到响应

这里是我的代码:

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)格式。

+0

@Soner Gonul:您的修改使我的问题从最新的问题中消失。 – Farshid

+0

这不仅仅是问题出现在生成此文件的服务器上。它只是从它中删除一些字节。如果不显示正在生成文件的服务器端代码,很难提供帮助。通常这是由于不恰当地部署一些IDisposable资源造成的。 –

+0

@DarinDimitrov:我自己提到过这种情况(从ASPX页面的响应中即时生成),这不是我的服务器,这是我想要从中下载文件的服务器。 – Farshid

回答

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并在请求中设置属性。

+0

谢谢Darin。几秒钟前我意识到问题是关于gzip,我解决了它。然而,你的答案是真正正确的,应该被选为正确的答案。 – Farshid

+0

对于那些可能在这里检查他们的问题的人:使用Fiddler来查看内容是否从您的Web服务器端进行了浏览,如果问题类似于我的问题,请使用@Darin所告知的方法或在此处检查备用解决方案:http://stackoverflow.com/questions/4567313/uncompressing-gzip-response-from-webclient – Farshid

相关问题