Веб-клиент с учетными данными все еще не загружает файл

Я пытаюсь загрузить файлы с веб-сайта, используя имя пользователя и пароль. Вам необходимо заплатить за зарегистрированный аккаунт, чтобы скачивать файлы - что мы и сделали. Я пытаюсь передать имя пользователя / пароль и загрузить файл следующим образом:

if (docUrl != null)
            {
                if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password))
                    this.WebClientInstance.Credentials = new NetworkCredential(username, password);

                fileData = this.WebClientInstance.DownloadData(docUrl);
                this.WebClientInstance.Dispose();
                isDataDownloaded = true;
            }

WebClientInstance - это System.Net.WebClient. Я отладил и подтвердил, что он попадает в строку для установки учетных данных. Вместо загрузки PDF-файла я получаю HTML-страницу, предлагающую мне войти в систему, чтобы получить доступ к файлу. Я проверил правильность имени пользователя и пароля. Я использую те же учетные данные для очистки веб-сайта с помощью WatiN.

Есть что-то еще, что я должен здесь делать?

ОБНОВЛЕНИЕ

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

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

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

    protected override WebRequest GetWebRequest(Uri address)
    {
        var webRequest = base.GetWebRequest(address);

        if (webRequest is HttpWebRequest)
            (webRequest as HttpWebRequest).CookieContainer = this.CookieContainer;

        return webRequest;
    }
}

Далее следует использовать метод WebClient.UploadValues ​​() для загрузки информации для входа на целевой веб-сайт. Полный процесс аутентификации и загрузки целевого ресурса выглядит следующим образом:

using (var webClient = new CookiesAwareWebClient())
                    {
                        var postData = new NameValueCollection()
                        {
                            { "userId", username },
                            { "password", password }
                        };

                        webClient.UploadValues(docUrl, postData);

                        fileData = webClient.DownloadData(docUrl);
                    }

Я ошибался насчет того, что сайт использует формы авторизации. Это веб-сайт JSP, использующий JSESSIONID. Я подтвердил, что получаю файл cookie с допустимым 32-байтовым значением JSESSIONID.

Однако когда я вызываю WebClient.DownloadData (), он по-прежнему возвращает только перенаправленную страницу входа. Я попытался исправить это, установив для свойства AllowAutoRedirect в HttpWebRequest значение false, но затем оно возвращает 0 байтов.

Есть ли что-то еще, что мне нужно сделать, чтобы он не перенаправлял и перенаправлял меня на ресурс после аутентификации?


person lintmouse    schedule 19.11.2012    source источник
comment
Использует ли сайт HTTP-аутентификацию?   -  person SLaks    schedule 19.11.2012
comment
Да, он использует SSL. Спасибо, что подняли этот вопрос. Я должен был упомянуть об этом.   -  person lintmouse    schedule 19.11.2012
comment
SSL не имеет ничего общего с HTTP-аутентификацией.   -  person SLaks    schedule 19.11.2012
comment
Ржу не могу. Я считаю, что он использует проверку подлинности с помощью форм. Требуются файлы cookie.   -  person lintmouse    schedule 19.11.2012
comment
Переходите на общественное питание? Вам все равно придется иметь дело с куки-файлами ...   -  person sinelaw    schedule 03.05.2013
comment
Хёк-хёк-хёк, я просто не могу победить, а?   -  person lintmouse    schedule 04.05.2013
comment
@dustmouse Меня все еще перенаправляют на страницу входа. Не могли бы вы уточнить URL-адрес, который нужно передать для метода UploadValues. Вот мой код..client.UploadValues ​​(xxx.com/cgi/cookie.php , ценности); var result = client.DownloadData (xxx.com / cgi /);   -  person user841311    schedule 17.02.2014


Ответы (1)


(Ответ на вопрос отредактирован. Преобразован в ответ сообщества вики. См. Вопрос без ответов, но проблема решена в комментариях (или расширена в чате))

ОП написала:

Решено. Так что проблема была между моими ушами. Я передавал URL-адрес защищенного ресурса методу .UploadValues ​​(), зная, что он будет перенаправлять на страницу входа. Однако мне действительно нужно было передать URL-адрес из формы входа (где он идет при отправке), а не саму страницу входа. Как только я это сделал, все заработало правильно. Думаю, сейчас я собираюсь сделать карьеру в сфере общественного питания.

ССЫЛКИ

На SO уже было опубликовано несколько вопросов, касающихся этой проблемы. Я просто сначала не знал, что искал, поэтому я не видел их ... Здесь есть пара хороших ресурсов, с которыми я столкнулся при работе над этой проблемой:

как поддерживать файлы cookie между двумя URL-адресами в asp .net

Попытка получить файлы cookie аутентификации с помощью HttpWebRequest

person Community    schedule 03.02.2015