我正在尝试使用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)格式。
答案 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并在请求上设置属性。