Как избежать сбоя приложения при загрузке файла с помощью WebClient (); - PullRequest
2 голосов
/ 13 октября 2010

Я использую C # WebClient ();скачать файл с сервера.Проблема в том, что когда у меня нет интернета или сервер не отвечает, происходит сбой моего приложения при попытке загрузить этот файл.Как лучше всего избегать сбоев, прерывать работу и давать уведомление о сбое соединения с сервером?

Ответы [ 3 ]

5 голосов
/ 13 октября 2010

Просто обработайте исключения, возвращаемые WebClient.DownloadFile :

try
{
    WebClient.DownloadFile(uri, myPath);
}
catch(WebException webEx)
{
     // There was an exception due to network or path problems...
     // Notify the user? 
}
2 голосов
/ 13 октября 2010

Сервер, не отвечающий на запросы, является исключительной ситуацией, которую лучше всего решать с использованием правильной обработки исключений с помощью блока try / catch.

Исключением, которое нужно обработать для запроса WebClient, является WebException.Вы можете проверить объект исключения для получения дополнительной информации.Свойство Status будет содержать значение состояния , которое даст вам дополнительную информацию о том, что на самом деле пошло не так.

Проверьте выборок в MSDN :

try 
{
    WebClient client = new WebClient();

    byte[] pageData = client.DownloadData("http://www.contoso.com");
    string pageHtml = Encoding.ASCII.GetString(pageData);
    Console.WriteLine(pageHtml);

    client.DownloadFile("http://www.contoso.com", "page.htm");
}
catch (WebException webEx) 
{
    Console.WriteLine(webEx.ToString());
    if(webEx.Status == WebExceptionStatus.ConnectFailure) 
    {
        Console.WriteLine("Are you behind a firewall?  If so, go through the proxy server.");
    }
}
1 голос
/ 13 октября 2010

Если он интерактивный, то да, это было бы лучше всего сделать при обнаружении соответствующего исключения. Если вы все прервали или дали сообщение (и было ли это сообщение модальным или немодальным), будет зависеть от вашего общего пользовательского интерфейса. Как правило, прерывание более приемлемо в командной строке или в веб-приложении (с соответствующим ответом для каждого), прерывание только этой операции с сообщением об ошибке больше подходит для приложения с графическим интерфейсом.

Если бы это было что-то, работающее как служба и т. Д., Вы бы хотели зарегистрировать исключение и перейти к следующей операции, возможно, с некоторой степенью отсрочки (два исключения подряд, немного подождите, пока сеть) может быть полностью отключен; другое исключение, подождите дольше)

В любом случае вы должны явно перехватить WebException s (и, возможно, IOException из-за попытки сохранить файл не удалось) и позволить другим исключениям (которые, скорее всего, связаны с ошибками в приложении), будет перехвачен общая стратегия обработки исключений.

...