C# 如何从nseindia.com下载https文件?
我尝试了以下代码。收到的错误是“基础连接已关闭:接收时发生意外错误” 系统操作系统:Windows 7 Home Basic SP1 .net版本:4.5.2C# 如何从nseindia.com下载https文件?,c#,.net,webclient,C#,.net,Webclient,我尝试了以下代码。收到的错误是“基础连接已关闭:接收时发生意外错误” 系统操作系统:Windows 7 Home Basic SP1 .net版本:4.5.2 using System; using System.Net; using System.Net.Security; namespace wc_downloadfile { class Program { public static void Main(string[] args) {
using System;
using System.Net;
using System.Net.Security;
namespace wc_downloadfile
{
class Program
{
public static void Main(string[] args)
{
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
using(WebClient wc = new WebClient())
{
string src = "https://nseindia.com/content/indices/ind_nifty50list.csv";
string dest = @"C:\temp\N50.csv";
try
{
var ua = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36";
wc.Headers.Add(HttpRequestHeader.UserAgent, ua);
wc.Headers.Add(HttpRequestHeader.Accept, "*/*");
wc.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate");
wc.DownloadFile(src, dest);
}
catch (Exception e)
{
Console.WriteLine("Unable to download file --- " + e.Message);
}
}
Console.ReadKey(true);
}
}
}
修改了用户代理值,问题得到解决。以下是工作代码
using System;
using System.Net;
using System.Net.Security;
namespace wc_downloadfile
{
class Program
{
public static void Main(string[] args)
{
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
using(WebClient wc = new WebClient())
{
string src = "https://nseindia.com/content/indices/ind_nifty50list.csv";
string dest = @"C:\temp\N50.csv";
try
{
//Removed Chrome/61.0.3163.100
var ua = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36";
wc.Headers.Add(HttpRequestHeader.UserAgent, ua);
wc.Headers.Add(HttpRequestHeader.Accept, "*/*");
wc.DownloadFile(src, dest);
}
catch (Exception e)
{
Console.WriteLine("Unable to download file --- " + e.Message);
}
}
Console.ReadKey(true);
}
}
}
删除此项:
wc.Headers.Add(HttpRequestHeader.AcceptEncoding,“gzip,deflate”)
或创建自定义WebClient,获取HttpWebRequest并设置[HttpWebRequest].AutomaticDecompression=DecompressionMethods.GZip | DecompressionMethods.Deflate代码>(或直接使用WebRequest/HttpClient)@Jimi。非常感谢。关于编码,您的评论很有价值。然而,这并不能解决问题。用户代理“Chrome/61.0.3163.100”导致了该问题。是的,可能会发生这种情况。如果您在标题中传递的浏览器版本支持此功能,有时网站会启用此功能并等待交互,WebRequest不支持此功能。作为建议,如果您只需要下载一个文件,请使用IE11头文件:Mozilla/5.0(Windows NT 6.1;WOW64;Trident/7.0;rv:11.0),就像Gecko一样“
。它不会触发任何有关编码的高级功能:):这与编码无关,而是与压缩算法有关。但是,编码也可能有问题,因为WebClient使用默认编码,即未指定任何编码。如果您有编码问题(您的文本看起来乱七八糟),请参阅此处的注释:使用WebResponse的编码。您可以添加一些关于此代码如何解决问题的描述吗?@Pratap Deshmukh。非常感谢。在你的回答中提到了用户代理,我能够解决这个问题。请阅读关于这个问题的评论。您使用了错误的/非官方的标题,因此您的用户代理有点未知/未定义。这些是实际的Chrome标头:。
using System;
using System.Net;
using System.Net.Security;
namespace wc_downloadfile
{
class Program
{
public static void Main(string[] args)
{
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
using(WebClient wc = new WebClient())
{
string src = "https://nseindia.com/content/indices/ind_nifty50list.csv";
string dest = @"C:\temp\N50.csv";
try
{
//Removed Chrome/61.0.3163.100
var ua = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36";
wc.Headers.Add(HttpRequestHeader.UserAgent, ua);
wc.Headers.Add(HttpRequestHeader.Accept, "*/*");
wc.DownloadFile(src, dest);
}
catch (Exception e)
{
Console.WriteLine("Unable to download file --- " + e.Message);
}
}
Console.ReadKey(true);
}
}
}