调用HttpWebRequest.GetResponse()时的ProtocolError

时间:2011-09-19 16:18:27

标签: httpwebrequest

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

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

我的代码是这样的(我在网上很多地方找到的一些代码......):

    "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();
    }"

现在问题是我得到“System.Net.WebException:远程服务器返回错误:(500)内部服务器错误。”当调用“myReq.GetResponse()”时 - 检查错误我发现状态是'ProtocolError'。

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

请提供任何提示我如何解决它......或完成此任务的任何其他可能性。

谢谢!

2 个答案:

答案 0 :(得分:4)

使用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

答案 1 :(得分:2)

好吧,我用Fiddler解决了这个问题......我把它们传递给了我的请求对象标题,就像我在Fiddler中看到的一样...&amp;它工作,没有错误