调用 HttpWebRequest.GetResponse() 时发生协议错误

aly*_*aly 4 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();
    }"
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢 !

aly*_*aly 6

我使用后的新代码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();
}
Run Code Online (Sandbox Code Playgroud)

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