Невозможно создать WebException

У меня есть метод, в котором я вызываю DownloadData в WebClient. Этот метод вызывает исключение, поскольку URL-адрес возвращает 404. Все это ожидается по спецификациям, поскольку ресурс не существует.

Веб-клиент выдаст WebException, и мне нужно прочитать тело ответа, поскольку оно содержит объект JSON с подробной ошибкой. После этого мне нужно снова выбросить WebException, поскольку уровень все еще ожидает WebException. На данный момент я пытаюсь создать WebException с деталями из текущего следующим образом:

catch(WebException ex)
{
   var response = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd();   
   dynamic error = JsonConvert.DeserializeObject(response);
   throw new WebException(error.message, null, ex.Status, ex.Response);
}

Проблема в том, что я получаю исключение при создании WebException. Это сообщение!

Лучшее совпадение перегруженного метода для 'System.Net.WebException.WebException (string, System.Net.WebExceptionStatus, System.Net.WebExceptionInternalStatus, System.Exception)' имеет некоторые недопустимые аргументы

Как будто этого конструктора не существует! Проверьте конструктор в исключении и проверьте конструктор в блоке catch.

Как видите, я использую верный конструктор. Проверьте здесь.

Что здесь происходит?


person Rob    schedule 15.02.2017    source источник
comment
Прочтите ошибку, ваши параметры, которые вы передаете, неверны   -  person David Pilkington    schedule 15.02.2017
comment
Попробуйте использовать свой null - звучит странно, я знаю, но это может помочь с разрешением перегрузки (если это действительно проблема).   -  person Manfred Radlwimmer    schedule 15.02.2017
comment
Также попробуйте использовать string message = error.message;, а затем использовать это - чтобы разрешение перегрузки происходило во время компиляции, а не во время выполнения.   -  person Jon Skeet    schedule 15.02.2017
comment
В этом случае я бы не стал использовать dymanic. Просто сделайте JsonConvert.DeserializeObject<JObject>(response) вместо этого, затем сделайте error['message'].ToString()   -  person Callum Linington    schedule 15.02.2017


Ответы (1)


Проблема в том, что вам нужно преобразовать error.message как строку. Было бы даже лучше, если бы вы обрабатывали эту строку по-другому, чтобы вы могли проверить, существует ли эта error.message.

catch(WebException ex)
{
    var response = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd();   
    dynamic error = JsonConvert.DeserializeObject(response);
    throw new WebException((string)error.message, null, ex.Status, ex.Response);
}
person MaticDiba    schedule 15.02.2017
comment
Как я уже сказал, попробуйте поставить дополнительную проверку для объекта ошибки, потому что он может не содержать свойство сообщения, и тогда у вас будет другое исключение :) - person MaticDiba; 15.02.2017