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

Posted

技术标签:

【中文标题】调用 HttpWebRequest.GetResponse() 时出现协议错误【英文标题】:ProtocolError while calling HttpWebRequest.GetResponse() 【发布时间】:2011-09-19 16:18:27 【问题描述】:

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

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

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

    "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错误...

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

谢谢!

【问题讨论】:

【参考方案1】:

我使用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 中看到的那样……它有效,没有错误

【讨论】:

您是如何将标头传递给请求对象的?你能显示那个代码吗?请注意,您应该在这里接受自己的答案,否则它将永远保持打开状态(您也会因此获得声誉)。 谢谢。但是您应该编辑此答案而不是创建一个新答案。

以上是关于调用 HttpWebRequest.GetResponse() 时出现协议错误的主要内容,如果未能解决你的问题,请参考以下文章

java三种调用方式(同步调用/回调/异步调用)

LINUX系统调用

引用调用 vs 复制调用调用

RPC 调用和 HTTP 调用的区别

js方法调用

深入理解Java虚拟机——方法调用(解析调用)