Каков наилучший способ возврата ошибок из службы WCF RESTful?
-
03-07-2019 - |
Вопрос
Использование WCF в режиме RESTful выглядит великолепно. Я & # 8217; большой фанат больших орудий, таких как простота и гибкость, но мне также нравится, как выглядят урлы. Что я могу сказать, я & # 8217; я программист.
Простой API для извлечения и редактирования ресурсов сопровождается почти одинаково простым набором возможных ответов об ошибках, и я не могу & # 8217; не чувствовать, что придерживаюсь & # 8220; чисто # 8221; Подход RESTful Я могу отрезать себе нос, несмотря на лицо, или, точнее, на нос потребителей моих веб-сервисов. Я могу ошибаться, но & # 8217; кажется, что очень много Http-кодов ошибок, которые я могу использовать, и нет способов вернуть свое сообщение об ошибке.
Чтобы уточнить, я говорю о правильных исключительных ошибках, а не об ожидаемых ошибках. Я хочу сообщить о проблеме пользователю, чтобы он мог определить, что ему нужно сделать, чтобы исправить ее.
Возможные варианты, которые я рассматриваю ...
<Ол>Просто используйте коды ошибок Http & # 8211; Похоже, это было бы слишком ограничительным в том, что я могу выразить, и не позволило мне & # 8217; t предоставить пользовательское сообщение. Пожалуйста (!) Поправьте меня, если я ошибаюсь.
Всегда возвращайте Http Success, но возвращайте настраиваемые объекты ошибок & # 8211; Очевидно, что это самый гибкий, но, безусловно, не самый RESTful.
Я был бы очень признателен, если бы кто-нибудь мог поделиться реальным опытом этой конкретной проблемы.
<Ч>Update
Спасибо за предложение использовать свойство StatusDescription
объекта OutgoingWebResponseContext
. Сначала мне показалось, что я могу это использовать. Р>
Я пришел к выводу, что мой второй вариант выше не для меня. Я хочу придерживаться того, что Http может дать мне.
У меня проблемы с тем, чтобы заставить его работать, однако. Независимо от значения, которое я предоставляю для этого свойства, оно не & # 8217; t не возвращается в ответе.
Мой метод обслуживания выглядит следующим образом
public MyType GetMyTypes(string criteria)
{
try
{
return GetMyTypes();
}
catch (Exception ex)
{
OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
response.StatusCode = HttpStatusCode.Forbidden;
response.StatusDescription = "A Big fat error occurred";
return null;
}
}
А вот и сырое ответное сообщение. Там нет упоминания о настраиваемом сообщении ...
HTTP / 1.1 403 Запрещено
Сервер: Сервер разработки ASP.NET / 9.0.0.0
Дата: среда, 07 января 2009 14:01:20 GMT
X-AspNet-версия: 2.0.50727
Cache-Control: частный
Длина контента: 0
Соединение: Закрыть
Мне не нужно просто обращаться к правильному свойству на клиенте. Информация просто не пересылается по ссылке. Р>
Что на самом деле делает это свойство <=>?
<Ч>Update
Я так и не узнал, как установить свойство StatusDescription. Я закончил тем, что не включил никаких сообщений об ошибках вообще, и пошел исключительно с кодами статуса Http. Я решил предоставить конечным точкам Soap и Restful для своих сервисов, чтобы клиенты могли выбирать, какие из них они предпочитают использовать & # 8211; простые сообщения Restful или относительно более богатые сообщения Soap.
Решение
Отправьте правильный код ответа, и вы можете указать собственное сообщение об ошибке в теле ответа.
Другие советы
В .net 4 добавьте < code> WebFaultException < T > (T errorDetail,
HttpResponseCode
code)
Здесь вы устанавливаете тип ответа на другой тип объекта, который имеет смысл, а также вы устанавливаете ResponseCode
, который вы хотите.
errorDetail
должен быть сериализуемым
Я добавляю код ошибки как выше (в описании статуса), так и в тело возвращаемой страницы в моих службах REST как:
OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
response.StatusCode = HttpStatusCode.Unauthorized;
response.StatusDescription = "You are not authorized.";
HttpContext.Current.Response.Write("You are not authorized.");
return null;
См. эта тема для аналогичного вопроса. Р>
Короче говоря, я полагаю, что вы можете установить код состояния HTTP (один из кодов ошибок) и предоставить свое настраиваемое сообщение на свойство StatusDescription :
OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
response.StatusCode = System.Net.HttpStatusCode.Forbidden;
response.StatusDescription = "Custom";
К сожалению, я не знаю много о распространенности этой техники в реальном мире.
Это может быть дефект. По состоянию на 22.09.2011 эта проблема рассматривается командой разработчиков продукта.