Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

HttpWebRequest error 403

Tags:

c#

.net

I am new in C# and have requirement to retrieve a url from C#. Most of case it’s working fine but in one case its throws an error. url is as follows http://whois.afrinic.net/cgi-bin/whois?searchtext=41.132.178.138

Error is:

Exception in the HTTP request for url: http://whois.afrinic.net/cgi-bin/whois?searchtext=41.132.178.138 The remote server returned an error: (403) Forbidden.

My code is as

void MyFUnction(string url)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

    request.UserAgent = ".NET Framework Test Client";
    request.ContentType = "application/x-www-form-urlencoded";
    Logger.WriteMyLog("application/x-www-form-urlencoded");


    // execute the request
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    // we will read data via the response stream
    Stream resStream = response.GetResponseStream();

    string tempString = null;
    int count = 0;
    do
    {
        // fill the buffer with data
        count = resStream.Read(buf, 0, buf.Length);

        // make sure we read some data
        if (count != 0)
        {
            // translate from bytes to ASCII text
            tempString = Encoding.ASCII.GetString(buf, 0, count);
            if (httpData == null)
                httpData = tempString;
            else
                httpData += tempString;

        }
    }
    while (count > 0); // any more data to read?
}
like image 432
CrazyC Avatar asked May 19 '26 07:05

CrazyC


2 Answers

Remove your ContentType line.

request.ContentType....

You're not doing a form post, only retrieving the page with "GET".

request.Method = "GET"; //this is the default behavior

And also set the Accept property to "text/html".

request.Accept = "text/html";
like image 158
Mikael Svenson Avatar answered May 20 '26 19:05

Mikael Svenson


Set

request.Accept = "text/html";
as well and it will work.

I don't know why they are configured that way, might be deliberate to discourage some bots. You might want to check their terms of service whether you may query their site automatically.


Edited to add: Still convinced that my answer was correct in this case, I can reproduce the 403 every time if I don't set the Accept header. The ContentType is superfluous, but not harmful.
In any case, you'll also want to change your function to properly dispose the response, and to read the response with the correct character encoding:

void MyFunction(string url)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    request.UserAgent = ".NET Framework Test Client";
    request.Accept = "text/html";
    Logger.WriteMyLog("application/x-www-form-urlencoded");

    // execute the request
    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
    {
        // we will read data via the response stream
        Stream resStream = response.GetResponseStream();
        StreamReader streamReader = new StreamReader(
                                      resStream,
                                      Encoding.GetEncoding(response.CharacterSet)
                                    );
        httpData = streamReader.ReadToEnd();
    }
}
like image 26
Hound Avatar answered May 20 '26 20:05

Hound



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!