2016-01-24 3 views
1

Вот мой WebClient класс:WebClient UploadValuesTaskAsync

class MyWebClient : WebClient 
{ 
    private CookieContainer _cookieContainer = new CookieContainer(); 
    public MyWebClient(string url, string login, string password) 
    { 
     var data = new NameValueCollection 
      { 
       { "username", login}, 
       { "password", password} 
      }; 
     UploadValues(new Uri(url), data); 
    } 
    protected override WebRequest GetWebRequest(Uri address) 
    { 
     WebRequest request = base.GetWebRequest(address); 
     if (request is HttpWebRequest) 
     { 
      (request as HttpWebRequest).CookieContainer = _cookieContainer; 
     } 
     return request; 
    } 
} 

А вот пример, как я хочу, чтобы использовать его:

private MyWebClient _client; 

private void btnLogin_Click(object sender, RoutedEventArgs e) 
{ 
    _client = new MyWebClient("http://website/login.php", "account", "pw"); 
} 

private async void btnContent_Click(object sender, RoutedEventArgs e) 
{ 
    _client = await _client.DownloadStringTaskAsync("http://website"); 
} 

И мой вопрос .. С этим MyWebClient класс, как можно i login async? Надеюсь, кто-то сможет мне помочь, спасибо!

+0

Не можете использовать 'UploadValuesAsync' и переместить его за пределы конструктора? –

ответ

1

Вы можете переместить логику входа в систему вне конструктора и использовать UploadValuesTaskAsync метод, как это:

class MyWebClient : WebClient 
{ 
    //... 
    private readonly string m_Uri; 
    private readonly string m_Login; 
    private readonly string m_Password; 

    public MyWebClient(string url, string login, string password) 
    { 
     m_Password = password; 
     m_Login = login; 
     m_Uri = url; 
    } 

    public async Task LogIn() 
    { 
     var data = new NameValueCollection 
     { 
      {"username", m_Login}, 
      {"password", m_Password} 
     }; 
     await UploadValuesTaskAsync(new Uri(m_Uri), data); 
    } 

    //... 
} 

И затем использовать его как это:

private async void btnLogin_Click(object sender, RoutedEventArgs e) 
{ 
    _client = new MyWebClient("http://website/login.php", "account", "pw"); 
    await _client.LogIn(); 
} 
+0

Работает отлично, спасибо Якуб Массад! – nrkz

+0

Добро пожаловать –