2011-09-23 5 views
1

웹 클라이언트 요청을 다시 시도 할 수 있습니까? 이상한 경우 xml 웹 서비스에 연결할 때 오류가 발생하지만 다시 시도하면 정상적으로 작동합니다. 나는 누군가가 더 나은 솔루션 :WebClient 다시 시도

private void ApplicationBarLogin_Click(object sender, EventArgs e) 
     { 
      settings.UsernameSetting = Username.Text; 
      if (RememberPassword.IsChecked == true) 
      { 
       settings.PasswordSetting = Password.Password; 
       settings.RememberPasswordSetting = true; 
      } 
      else 
      { 
       settings.RememberPasswordSetting = false; 
      } 

      WebClient internode = new WebClient(); 

      internode.Credentials = new NetworkCredential(settings.UsernameSetting, settings.PasswordSetting); 
      internode.DownloadStringCompleted += new DownloadStringCompletedEventHandler(internode_DownloadStringCompleted); 
      internode.DownloadStringAsync(new Uri("https://customer-webtools-api.internode.on.net/api/v1.5/")); 
     } 

     public void internode_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
     { 
      if (e.Error != null) 
      { 
       MessageBox.Show(e.Error.Message); 
      } 
      else 
      { 
       MessageBox.Show("Authentication successfull."); 
      } 
     } 

답변

1

오류가 발생하면 요청을 다시 발행 할 수 있습니다. 요청을 다시 발행 한 횟수를 유지함으로써 사용자에게 오류를 표시 할시기를 결정할 수 있습니다. 내 뜻을 설명하기 위해 코드를 빠르게 수정 한 것입니다.

private void ApplicationBarLogin_Click(object sender, EventArgs e) 
{ 
    settings.UsernameSetting = Username.Text; 
    if (RememberPassword.IsChecked == true) 
    { 
     settings.PasswordSetting = Password.Password; 
     settings.RememberPasswordSetting = true; 
    } 
    else 
    { 
     settings.RememberPasswordSetting = false; 
    } 

    WebClient internode = new WebClient(); 

    internode.Credentials = new NetworkCredential(settings.UsernameSetting, settings.PasswordSetting); 
    internode.DownloadStringCompleted += new DownloadStringCompletedEventHandler(internode_DownloadStringCompleted); 
    internode.DownloadStringAsync(new Uri("https://customer-webtools-api.internode.on.net/api/v1.5/")); 
} 

private int _retryCount = 0; 

public void internode_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
{ 
    if (e.Error != null) 
    { 
     _retryCount++; 
     if (_retryCount < 3) 
     { 
      WebClient internode = (WebClient)sender; 
      internode.DownloadStringAsync(new Uri("https://customer-webtools-api.internode.on.net/api/v1.5/")); 
     } 
     else 
     { 
      _retryCount = 0; 
      MessageBox.Show(e.Error.Message); 
     } 
    } 
    else 
    { 
     _retryCount = 0; 
     MessageBox.Show("Authentication successfull."); 
    } 
} 
1

웹 클라이언트가 어떤 재시도 기능이 내장되어 있지 않습니다를 가지고하지 않는 한 오류가 던지는 전에 두 번 다시 시도하고 싶습니다.

아마도 사용자에게 문제를 알리기 전에 직접 재시도 논리를 작성해야합니다.

+0

WebClient에서 재시도 기능을 수행 한 후 필자는 반드시 그런 것은 아닙니다. 위의 코드에 맞게 재시도 논리를 수행하는 방법은 무엇입니까? – cvandal