WebClient с использованием файла загрузки для захвата файла с сервера - Исключения обработки
-
20-09-2019 - |
Вопрос
У меня есть веб -служба, в которой я манипулирую пост и получаю методы для облегчения функциональности загрузки / загрузки для некоторых файлов в архитектуре стиля клиента / сервера. По сути, пользователь может нажать кнопку, чтобы загрузить конкретный файл, внести некоторые изменения в приложении, затем нажмите кнопку «Загрузить», чтобы отправить его обратно.
Проблема, которую я становлюсь с загрузкой. Скажем, пользователь ожидает 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();
}
}
}