网络客户端重试

cva*_*dal 2 c# silverlight wpf xaml windows-phone-7

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

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.");
            }
        }
Run Code Online (Sandbox Code Playgroud)

Chr*_*lor 5

如果失败,您可以重新发出请求。通过记录重新发出请求的次数,您可以确定何时向用户显示错误。这是对您的代码的快速修改,以演示我的意思。

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.");
    }
}
Run Code Online (Sandbox Code Playgroud)