HttpWebRequest与浏览器请求

时间:2010-12-31 08:03:17

标签: c#

我曾经使用c#程序从网站检索数据。(nseindia.com)但最近NSE做了一些更改,以便任何程序的任何请求都以“403 Forbidden Error”响应。任何人都可以告诉我一种方法,使程序中的请求与浏览器中的请求相同。我尝试设置userAgent属性,但那不起作用。代码粘贴在下面。

string DownloadData(string CompanyName)
{
    string address = string.Format(@"http://www.nseindia.com");
    //http://www.nseindia.com/marketinfo/sym_map/symbolMapping.jsp?dataType=priceVolumeDeliverable&symbol=abb&
    //http://www.nseindia.com/content/equities/scripvol/datafiles/01-12-2008-TO-29-12-2010ABBALLN.csv
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(address);
    request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3

    string strData = "";
    try
    {
        request.Proxy = WebProxy.GetDefaultProxy();
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        System.IO.Stream stream = response.GetResponseStream();
        System.Text.Encoding ec = System.Text.Encoding.GetEncoding("utf-8");
        System.IO.StreamReader reader = new System.IO.StreamReader(stream, ec);
        strData = reader.ReadToEnd();
        if (strData.Contains("Error"))
        {
            Exception e = new Exception(strData);
            throw e;
        }
    }
    catch(Exception e)
    {
        Console.WriteLine(e.ToString());
    }

    return strData;
}

3 个答案:

答案 0 :(得分:3)

您最好的办法是监视您的浏览器,以查看发送的请求和收到的回复。

根据您的浏览器,有很多插件。

答案 1 :(得分:2)

尝试设置Accept HTTP标头; e.g:

request.Accept = "Accept: text/html,application/xhtml+xml,application/xml";

我通过运行Fiddler2(在对另一个答案的评论中建议)来达到这个建议,以便了解我的浏览器(Firefox 4 Beta)如何向您提到的网站发出HTTP请求。

然后我在代码中设置所有标题并逐个删除。我删除Accept标头后,立即返回403状态代码。

我的浏览器发出的确切请求:

GET / HTTP/1.0
Host: www.nseindia.com
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:2.0b8) Gecko/20100101 Firefox/4.0b8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7

PS:您在评论中提到的其他URI似乎无效。一个不完整,产生500 Internal Server Error,另一个产生404 Not Found响应。

答案 2 :(得分:0)

尝试将凭据设置为默认值

request.Credentials = System.Net.CredentialCache.DefaultCredentials;

NetworkCredential nc = new NetworkCredential("user", "password");
request.Credentials = nc;

如果您需要用户名密码才能访问该网页

或另一种选择是使用WebBrowser控制;)