Почему C # HttpWebRequest возвращает 500 ошибку на ResponseStream, но не с PHP? - PullRequest
2 голосов
/ 17 января 2011

Буду очень признателен, если кто-нибудь сможет мне помочь с этой проблемой. У меня есть код C #, который читает содержимое веб-страницы для последующего анализа. Код:

        private StringReader ReadInUrl(string url)
        {
            string result = string.Empty;            
            System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
            request.Method = "GET";           

            using (var stream = request.GetResponse().GetResponseStream())
            using (var reader = new StreamReader(stream, Encoding.UTF8))
            {
                result = reader.ReadToEnd();
            }
            return new StringReader(result);
        }

Код отлично работает с большинством страниц, но выдает «Удаленный сервер вернул ошибку: (500) Внутренняя ошибка сервера». с некоторыми страницами. Пример страницы, которая выдает ошибку: http://www.thehut.com/blu-ray/harry-potter-collection-years-1-6/10061821.html

Меня смущает то, что я могу нормально просматривать страницу, используя веб-браузер, а также могу получить содержимое файла с помощью PHP fopen и fread, а затем проанализировать его в PHP.

Мне действительно нужно быть в состоянии сделать это в C #, и я озадачен тем, почему это происходит. Если кто-нибудь может сообщить мне, почему я могу читать на странице, используя PHP, а не C #, и есть ли в C # параметр, который может обойти эту проблему? Любые ответы с благодарностью получены!

Ответы [ 2 ]

7 голосов
/ 17 января 2011

Веб-сайт отбрасывает запросы, в которых не указан пользовательский агент. Так что вам нужно это указать. Также я рекомендую вам использовать WebClient вместо HttpWebRequest, HttpWebResponse, StreamReader, StringReader и компанию:

class Program
{
    public static void Main()
    {
        using (var client = new WebClient())
        {
            client.Headers[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13";
            string result = client.DownloadString("http://www.thehut.com/blu-ray/harry-potter-collection-years-1-6/10061821.html");
            Console.WriteLine(result);
        }
    }
}

это немного короче и работает.

1 голос
/ 17 января 2011

Я подозреваю, что PHP включает некоторый заголовок, который WebRequest не включает по умолчанию - и сервер не справляется с этим.Я только что воспроизвел это сам, и это действительно - внутренняя ошибка сервера на thehut.com.Вот исключение на стороне сервера, поскольку оно отображается в возвращаемом HTML-коде:

org.apache.jasper.JasperException: java.lang.NullPointerException
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:486)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:416)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:968)
org.apache.jsp.hut.errors.error_jsp._jspService(error_jsp.java:71)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
com.thehut.elysium.filter.SiteFilter.forwardToErrorPage(Unknown Source)
com.thehut.elysium.filter.SiteFilter.doFilter(Unknown Source)
com.thehut.elysium.filter.SlowRequestFilter.doFilter(Unknown Source)
com.thehut.elysium.filter.SetCharacterEncodingFilter.doFilter(Unknown Source)

Не очень полезно, но оно в основном подтверждает, что это проблема на стороне сервера - и, безусловно, звучит подозрительно какзаголовок, который, как предполагает сервлет, будет присутствовать.

Вы можете попробовать сделать тот же запрос из вашего PHP-кода и посмотреть, какие заголовки он использует (используя Wireshark ).Добавляйте эти заголовки в .NET WebRequest по одному и посмотрите, что ему нужно, прежде чем он начнет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...