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

标签 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

让我感到困惑的是,我可以使用网络浏览器正常查看页面,而且我还可以使用 PHP fopen 和 fread 获取文件的内容,然后在 PHP 中解析它。

我确实需要能够在 C# 中执行此操作,但我对它发生的原因感到困惑。如果有人可以让我知道为什么我可以使用 PHP 而不是 C# 读取页面,以及 C# 中是否有可以解决此问题的设置?非常感谢收到任何答复!

最佳答案

该网站丢弃未指定用户代理的请求。所以你需要指定它。另外,我建议您使用 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);
        }
    }
}

它有点短而且有效。

关于c# - 为什么 C# HttpWebRequest 会在 ResponseStream 上返回 500 错误,而 PHP 却不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4717510/

相关文章:

c# - 多次使用 ||和 && 操作数

c# - 属性中的冒号被 XmlDocument 截断了吗?

.net - .NET HttpWebRequest 中的压缩( header )错误?

c# - 如何从 CookieCollection 中删除所有过期的 cookie?

.net - WebClient、HttpWebRequest 和 HttpClient 的最大并发请求数

c# - 如何将头文件导入到导入 C++ dll 的 C# 项目中

c# - DataGridView.CellContentClick

.net - Mono 实现 CLR 吗?或者至少有一些非托管内部调用?或无?

c# - 将实体映射到存储过程时,如何在调用 SaveChanges() 后获取实体的标识

c# - SpinWait.SpinUntil 的替代方案