С#: веб-клиент загружает исходный код html-страницы вместо фактического ресурса

Я взял этот код из одного из блогов MSDN и добавил веб-клиент для загрузки ресурса.

string formUrl = "My login url";
            string formParams = string.Format("userName={0}&password={1}&x={2}&y={3}&login={4}", "user", "password","0","0","login");
            string cookieHeader;
            WebRequest req = WebRequest.Create(formUrl);
            req.ContentType = "application/x-www-form-urlencoded";
            req.Method = "POST";
            byte[] bytes = Encoding.ASCII.GetBytes(formParams);
            req.ContentLength = bytes.Length;
            using (Stream os = req.GetRequestStream())
            {
                os.Write(bytes, 0, bytes.Length);
            }
            WebResponse resp = req.GetResponse();
            cookieHeader = resp.Headers["Set-cookie"];
            string pageSource;
            string getUrl = "Resource url";
            WebRequest getRequest = WebRequest.Create(getUrl);
            getRequest.Headers.Add("Cookie", cookieHeader);
            WebResponse getResponse = getRequest.GetResponse();
            using (StreamReader sr = new StreamReader(getResponse.GetResponseStream()))
            {
                pageSource = sr.ReadToEnd();
                System.Console.WriteLine(sr.ToString());
            }

            WebClient wc = new WebClient();
            wc.Headers["Content-Type"] = "application/x-www-form-urlencoded";

            wc.DownloadFile("Resource url","C:\\abc.tgz");
            Console.Read();

Но abc.tgz не такой, каким должен быть. Поэтому, когда я открыл его с помощью блокнота, я заметил, что это исходный файл страницы «Мой URL-адрес для входа»... Где я ошибаюсь?

Есть ли какое-либо свойство веб-клиента, которое я могу использовать, чтобы увидеть ошибку .. т.е. .. базовый адрес и т. д.?


person HelloWorld_Always    schedule 10.06.2011    source источник
comment
Вы уверены, что все поля формы названы правильно?   -  person Daniel A. White    schedule 10.06.2011
comment
Он не загружает исходный код — он обслуживает HTML-страницу входа в систему; это все. В большинстве случаев такие защищенные страницы не предназначены для парсинга. Вы проверили, что это находится в Условиях и положениях сайта, да?   -  person Marc Gravell    schedule 10.06.2011
comment
getUrl отличается от formUrl. Должны ли они быть двумя отдельными запросами?   -  person Bala R    schedule 10.06.2011
comment
Похоже, ваш код делает именно то, что он должен. Он загружает страницу, на которую перенаправляется.   -  person Security Hound    schedule 10.06.2011


Ответы (1)


Давайте упростим задачу, давайте:

public class CookiesAwareWebClient : WebClient
{
    public CookieContainer CookieContainer { get; private set; }

    public CookiesAwareWebClient()
    {
        CookieContainer = new CookieContainer();
    }

    protected override WebRequest GetWebRequest(Uri address)
    {
        var request = base.GetWebRequest(address);
        ((HttpWebRequest)request).CookieContainer = CookieContainer;
        return request;
    }
}

class Program
{
    static void Main()
    {
        using (var client = new CookiesAwareWebClient())
        {
            var values = new NameValueCollection
            {
                { "userName", "user" },
                { "password", "password" },
                { "x", "0" }, // <- I doubt the server cares about the x position of where the user clicked on the image submit button :-)
                { "y", "0" }, // <- I doubt the server cares about the y position of where the user clicked on the image submit button :-)
                { "login", "login" },
            };

            // We authenticate first
            client.UploadValues("http://example.com/login", values);

            // Now we can download
            client.DownloadFile("http://example.com/abc.tgz", @"c:\abc.tgz");
        }
    }
}

И, кстати, проблема с вашим кодом заключается в том, что вы не передаете файл cookie аутентификации, выданный сервером, когда вы отправили первый запрос на второй запрос, который должен получить доступ к защищенному ресурсу. Все, что вы передаете, это какой-то тип контента, а не cookie и все такое. Серверы любят куки :-)

person Darin Dimitrov    schedule 10.06.2011
comment
Большое спасибо Дарин .. ! - person HelloWorld_Always; 13.06.2011