Я пытаюсь загрузить файлы с веб-сайта, используя имя пользователя и пароль. Вам необходимо заплатить за зарегистрированный аккаунт, чтобы скачивать файлы - что мы и сделали. Я пытаюсь передать имя пользователя / пароль и загрузить файл следующим образом:
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 байтов.
Есть ли что-то еще, что мне нужно сделать, чтобы он не перенаправлял и перенаправлял меня на ресурс после аутентификации?