为什么C#HttpWebRequest会在ResponseStream上返回500错误,而不是PHP?

时间:2011-01-17 20:25:07

标签: c# .net httpwebrequest

如果有人能帮我解决这个问题,我将非常感激。我有一些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

令我困惑的是我可以使用webbrowser查看页面,我也可以使用PHP fopen和fread获取文件的内容,然后在PHP中解析它。

我真的需要能够在C#中做到这一点,我很难过为什么会这样。如果任何人可以让我知道为什么我可以使用PHP而不是C#在页面中阅读,以及C#中是否有可以解决此问题的设置?感激地收到任何答案!

2 个答案:

答案 0 :(得分:7)

网站会删除未指定用户代理的请求。所以你需要指定它。另外,我建议您使用WebClient代替HttpWebRequestHttpWebResponseStreamReaderStringReader和公司:

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 :(得分:1)

我怀疑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)

并不是非常有帮助,但它确实基本上确认它是服务器端问题 - 而且它肯定听起来像servlet假定的标题会出现。

您可以尝试从PHP代码发出相同的请求,并查看它使用的标头(使用Wireshark)。一次将这些标题添加到.NET WebRequest中,并在它开始工作之前查看它需要什么。