调用HttpWebRequest.GetResponse()时出现协议错误。

4

我有一个包含文件链接的页面。

基本上,我需要访问页面源代码以便解析并获取所有文件的超链接。

我的代码类似于以下内容(在网络上找到的一些代码片段...):

    "private static byte[] ReadImageFromUrl(string url)
    {
        var myReq = (HttpWebRequest)WebRequest.Create(url);

        myReq.Timeout = 10000;

        WebResponse myResp = myReq.GetResponse();

        Stream stream = myResp.GetResponseStream();

        List<byte> bytesList = new List<byte>();

        using (var br = new BinaryReader(stream))
        {
            try
            {
                while (true)
                {
                    var b = br.ReadByte();
                    bytesList.Add(b);
                }
            }
            catch (Exception)
            {}

            br.Close();
        }

        myResp.Close();

        return bytesList.ToArray();
    }"

现在的问题是当我调用“myReq.GetResponse()”时,我收到“System.Net.WebException: The remote server returned an error: (500) Internal Server Error.”的错误 - 检查错误后,我发现状态为'ProtocolError'。

WebException对象的响应属性包含一些服务器错误..(尽管从浏览器打开它时它正确打开)...而且当我使用其中一个文件的url调用此函数时,我得到了相同的ProtocolError状态,但是是404错误...

请给出任何提示,如何解决它...或者完成此任务的任何其他可能性。

谢谢!

2个回答

5

使用 Fiddler 后,我的新代码如下:

private static byte[] ReadFileFromUrl(string url)
{
    var myReq = (HttpWebRequest)WebRequest.Create(url);
    myReq.Accept = const_AcceptHeader;                
    myReq.Headers.Set(const_AcceptLanguageHeaderName, const_AcceptLanguageHeader);
    myReq.UserAgent = const_AcceptUserAgentHeader;
    myReq.CookieContainer = new CookieContainer();               
    myReq.KeepAlive = true;
    myReq.Timeout = Int32.Parse(ConfigSettings.RequestPageTimeout) * 1000;
    WebResponse myResp = null;
    List<byte> bytesList = null;
    myResp = myReq.GetResponse();
    Stream stream = myResp.GetResponseStream();
    bytesList = new List<byte>();
    using (var br = new BinaryReader(stream))
    {
        try
        {
            while (true)
            {
                var b = br.ReadByte();
                bytesList.Add(b);
            }
        }
        catch (Exception ex)
        {
            throw;
        }

        br.Close();
    }                

    return bytesList.ToArray();
}

所有以const_开头的变量都来自Fiddler

2

我使用 Fiddler 解决了这个问题…我按照 Fiddler 中的请求头信息添加到我的请求对象中…它有效地工作了,没有错误。


你是如何将头信息传递给请求对象的?你能展示一下代码吗?请注意,你应该接受自己的答案,否则它会一直保持开放状态(你也会因此获得声望)。 - Tim Schmelter
谢谢。但是你应该编辑这个答案而不是创建一个新的。 - Tim Schmelter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接