хранить аутентификации печенье в к staic CookieContainer в моем приложении, благодаря ответу на этот link(1)Очень странное поведение с WebClient.UploadFileASync
Я реализовал код, чтобы получить CookieContainer на DocumentCompleted
события :
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (!this.webBrowser1.Document.Title.Replace(" ", string.Empty).ToLower().Contains("xxx"))
{
CookieContainer ck = GetUriCookieContainer(this.webBrowser1.Url);
validSession = ck;
Succeeded = true;
this.Close();
}
}
так как я использую WebClient
, мне нужно создать расширение его, поэтому он может хранить CookieContainer:
public class WebClientEx : WebClient
{
public WebClientEx()
: this(new CookieContainer())
{ }
public WebClientEx(CookieContainer c)
{
this.CookieContainer = c;
}
public CookieContainer CookieContainer { get; set; }
protected override WebRequest GetWebRequest(Uri address)
{
WebRequest request = base.GetWebRequest(address);
var castRequest = request as HttpWebRequest;
if (castRequest != null)
{
castRequest.CookieContainer = this.CookieContainer;
}
return request;
}
}
После сохранения CookieContainer из (1), я могу запросить любое содержимое страницы без аутентификации:
WebClientEx e = new WebClientEx(validSession);
string x = e.UploadString(new Uri("http://localhost:14590/default.aspx"), "ola");
// x now contains the html page of default.aspx
Проблема заключается в том, когда я пытался загрузить файл на сервер, используя UploadFileAsync
Я постараюсь описать проблему шаг за шагом:
- Откройте приложение
- Открыть форму Логин (URL по умолчанию будет перейти на страницу default.aspx)
- Войти на сайт с
WebBrowser
управления - веб-браузера будет перемещаться к Default.aspx страница
- Хранить печенье
- Загрузить файл, используя метод
UploadFileAsync
- Результат (e.result) на
UploadFileCompleted
события это html-содержимое страницы входа, что означает, что CookieContainer, который я передал в WebClient, не работает.
Но, пожалуйста, посмотрите на эти шаги, функция загрузки будет работать без проблем:
- Откройте приложение
- Открыть форму Логин (URL по умолчанию будет перемещаться на default.aspx странице)
- WebBrowser перейдет к default.aspx странице
- Сохраните файл cookie
- Открытая форма входа, теперь веб-браузер будет перемещаться непосредственно в папку de fault.aspx, поскольку аутентифицированный сеанс по-прежнему доступен.
- Загрузить файл, используя метод
UploadFileAsync
-> Успех - Я уверен, CookieContainer который я получаю при первой попытке входа в систему правильно, потому что я в состоянии использовать WebClient.UploadString() или любой HttpWebRequest к серверу с ним, кстати, я проверил CookieContainer на втором attemp, и он идентичен первому.
Я не могу понять, почему это происходит? У вас есть идеи, почему? Обратите внимание: если я использую другой метод, например WebClient.UploadString(), перенаправление на страницу входа в систему, если доступно cookieContainer, отсутствует.