У меня есть веб-служба, в которой я манипулирую методами POST и GET, чтобы облегчить загрузку/выгрузку некоторых файлов в архитектуре клиент/сервер. По сути, пользователь может нажать кнопку, чтобы загрузить определенный файл, внести некоторые изменения в приложение, а затем нажать кнопку загрузки, чтобы отправить его обратно.
У меня проблема с загрузкой. Скажем, пользователь ожидает 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 на стороне клиента, чтобы использовать метод DownloadFile, который затем использует код, который у меня есть выше, я получаю:
WebException не было обработано: удаленный сервер вернул ошибку: (500) Внутренняя ошибка сервера.
(Во время отладки) Если я подключаюсь к браузеру и использую http://localhost:xxx/1.txt
, я могу выполнить код на стороне сервера и выдать исключение, как и предполагалось. Поэтому я думаю, мне интересно, как я могу правильно обработать внутреннюю ошибку сервера на стороне клиента, чтобы я мог вернуть что-то значимое, например «Файл не существует». Одна мысль заключалась в том, чтобы использовать try catch вокруг метода WebClient.DownloadFile(address, filename)
, но я не уверен, что это единственная ошибка, которая произойдет, т.е. файл не существует.
изменить: следуя решению с помощью HttpResponse
Итак, если бы я использовал HttpResponse, мог бы я получить несколько предложений о том, как начать?
Я удаляю генерацию исключения со стороны клиента и заменяю его пользовательским HttpResponse? Так что в основном я думаю, что я бы выбрал код для использования, скажем, 200, и принудительно вернул код 200 в этом операторе if выше. Смотрите комментарий.
Затем на стороне клиента просто используйте If (Response.StatusCode == 200)
и делайте все, что я хочу (сообщите, что файл пользователя не существует)
Я на верном пути?
изменить 2:
Я пытался использовать try catch вокруг моих методов копирования файлов, а затем в catch, устанавливая код состояния или описание состояния, но это вызывает исключения при установке описания состояния .. вот так:
context.Response.StatusDescription = ex.ToString();
context.Response.Status = ex.ToString();
ArgumentOutOfRangeException — указанный аргумент находится вне диапазона допустимых значений.