【问题标题】:WebClient RetryWeb客户端重试
【发布时间】:2011-09-23 10:35:03
【问题描述】:

是否可以重试 webclient 请求?在奇怪的情况下,我的应用程序在尝试连接到 xml Web 服务时会抛出错误,但如果我重试,它可以正常工作。我希望它在抛出错误之前重试 2 次,除非有人有更好的解决方案:)

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.");
            }
        }

【问题讨论】:

    标签: c# wpf silverlight xaml windows-phone-7


    【解决方案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.");
        }
    }
    

    【讨论】:

      【解决方案2】:

      WebClient 没有任何内置的重试功能。

      您应该先自己构建重试逻辑,然后再通知用户问题。

      【讨论】:

      • 我不一定是在 WebClient 中的重试功能之后。我将如何完成重试逻辑以适合我上面的代码?
      猜你喜欢
      • 1970-01-01
      • 2011-05-15
      • 1970-01-01
      • 1970-01-01
      • 2018-04-19
      • 1970-01-01
      • 2014-09-04
      • 2020-10-23
      • 1970-01-01
      相关资源
      最近更新 更多