2015-12-08 2 views
2

хранить аутентификации печенье в к 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, отсутствует.

ответ

0

По некоторым неизвестным причинам, CookieContainer вызывает эту проблему, после просмотра скрипача, я понимаю, первый звонок от webclient на сервер не содержит каких-либо куки, поэтому я избавляюсь от CookieContainer и заменить его следующим образом:

WebClient e = new WebClient(); 
    e.Headers.Add(HttpRequestHeader.Cookie, "cookies I get from webbrowser control"); 

И вуаля, все в порядке!

Смежные вопросы