WebClient с использованием файла загрузки для захвата файла с сервера - Исключения обработки

StackOverflow https://stackoverflow.com/questions/2444888

Вопрос

У меня есть веб -служба, в которой я манипулирую пост и получаю методы для облегчения функциональности загрузки / загрузки для некоторых файлов в архитектуре стиля клиента / сервера. По сути, пользователь может нажать кнопку, чтобы загрузить конкретный файл, внести некоторые изменения в приложении, затем нажмите кнопку «Загрузить», чтобы отправить его обратно.

Проблема, которую я становлюсь с загрузкой. Скажем, пользователь ожидает 3 файла 1.txt, 2.txt и 3.txt. Кроме 2.txt не существует на сервере.

Итак, у меня есть код, как (на стороне сервера):

public class HttpHandler : IHttpHandler
{

    public void ProcessRequest
    {
       if (context.Request.HttpMethod == "GET")
       {
          GoGetIt(context)
       }
    }

private static void GoGetIt(HttpContext context)
{
     var fileInfoOfWhereTheFileShouldBe = new FileInfo(......);

     if (!fileInfoOfWhereTheFileShouldBe.RefreshExists())
     {
          //Remove this line below
          //throw new Exception("Oh dear the file doesn't exist");

          //Replace with a force return of whichever code I chose e.g. 200
          ??...
     }

    ...

Поэтому у меня возникает проблема в том, что когда я запускаю приложение, и я использую WebClient на стороне клиента, чтобы использовать метод загрузки файла, который затем использует код, который у меня есть выше, я получаю:

WebException было неразрушаемое: удаленный сервер вернул ошибку: (500) Ошибка внутреннего сервера.

(Во время отладки) Если я прикрепляюсь к браузеру и использую http://localhost:xxx/1.txt Я могу пройти через код на стороне сервера и бросить исключение, как предполагалось. Так что, я думаю, мне интересно, как я могу правильно обработать ошибку внутреннего сервера на стороне клиента, чтобы я мог вернуть что -то значимое, как «Файл не существует». Одна мысль заключалась в том, чтобы использовать попытку уловить вокруг WebClient.DownloadFile(address, filename) Метод, но я не уверен, что это единственная ошибка, которая произойдет, то есть файла не существует.

РЕДАКТИРОВАТЬ: Следуя решению, используя httpresponse

Итак, если бы я использовал httpresponse, могу ли я получить несколько предложений как начать?

Я удаляю исключение с клиентской стороны и заменяю на пользовательский httpresponse? Так что, по сути, я бы выбрал код для использования, скажем, 200 и заставил код возврата 200 в этом операторе выше. Смотрите комментарий.

Затем на стороне клиента просто используйте If (Response.StatusCode == 200) и делай то, что я хочу сделать (информировать пользовательский файл не существует)

Я в порядке?

РЕДАКТИРОВАТЬ 2:

Я пытался использовать Try Catch About My Methods Copy Method, а затем в подъеме установить код состояния или описание состояния, но это бросает исключения при настройке описания состояния .. например:

context.Response.StatusDescription = ex.ToString();
context.Response.Status = ex.ToString();

ArgentOutOfRangeException - Указанный аргумент был вне диапазона допустимых значений.

Это было полезно?

Решение

Если вы программируете IHttpHandler Интерфейс. Вы не должны бросать исключения в этом коде. Никогда!

Вместо этого используйте Response.StatusCode а также Response.StatusDescription вернуться значимая информация клиенту.

Пусть бросает исключение только в систему, потому что тогда это будет В САМОМ ДЕЛЕ быть исключением из ВАШ код.

Отредактировано, чтобы добавить

Отвечая на ваше редактирование, как я бы сделал это, если в случае, если файл не найден на стороне сервера, вернет 404 Код статуса. И пусть клиент справится с этим.

Тем не менее, как вы ставите, вы имеете дело с веб -службой, поэтому я бы просто добавил в заголовки дополнительный ответ, чтобы лучше указать, что на самом деле идет на стороне сервера в ваше клиентское приложение.

Отредактировано, чтобы добавить

Response.Status И есть целое число. Вот почему вы получаете ArgumentOutOfRangeException.

Убедитесь, что статус является одним из действительных Http коды возврата.

Другие советы

Вместо того, чтобы бросить исключение, войдите в систему исключения в текстовом файле или журнале событий, чтобы вы могли точно увидеть, что произошло, когда произойдет ошибка.

Вот пример кода для регистрации событий http://support.microsoft.com/kb/307024Анкет Для сохранения в текстовом файле

    public void WriteExceptionToDisk(Exception exceptionLog)
    {

        string loggingname = @"c:\Exception-" + DateTime.Today.Month.ToString()
                             + "-" + DateTime.Today.Day.ToString() + "-" +
                             DateTime.Today.Year.ToString() + ".txt";
        // Put the exception some where in the server but
        // make sure Read/Write permission is allowed.
        StringBuilder message = new StringBuilder();
        if (exceptionLog != null)
        {
            message.Append("Exception Date and Time ");
            message.AppendLine(); 
            message.Append("   ");
            message.Append(DateTime.Today.ToLongDateString() + " at ");
            message.Append(DateTime.Now.ToLongTimeString());
            message.AppendLine();
            message.Append("Exception Message ");
            message.AppendLine(); message.Append("   ");
            message.Append(exceptionLog.Message);
            message.AppendLine();
            message.AppendLine("Exception Detail ");
            message.AppendLine();
            message.Append(exceptionLog.StackTrace);
            message.AppendLine();
        }
        else if (message == null || exceptionLog == null)
        {
            message.Append("Exception is not provided or is set as null.Please pass the exception.");
        }

        if (File.Exists(loggingname))// If logging name exists, then append the exception message
        {

            File.AppendAllText(loggingname, message.ToString());
        }
        else
        {
            // Then create the file name
            using (StreamWriter streamwriter = File.CreateText(loggingname))
            {
                streamwriter.AutoFlush = true;
                streamwriter.Write(message.ToString());
                streamwriter.Close();
            }                 
        }
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top