C# 网络客户端可以';t下载从写入到响应动态生成的文件
我正试图使用C#中的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
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告诉的方法,或在此处检查其他解决方案: