Использование WCF в режиме RESTful кажется великолепным. Я большой поклонник больших пушек, таких как простота и гибкость, но мне также нравится, как выглядят урлы. Что я могу сказать, я программист.
Простой API для поиска и редактирования ресурсов сопровождается почти одинаково простым набором возможных ответов об ошибках, и я не могу удержаться от ощущения, что, придерживаясь «чистого» подхода RESTful, я, возможно, отрезаю себе нос, несмотря на это. лицом, или, более конкретно, носом моих потребителей веб-услуг. Я могу ошибаться, но, похоже, я не могу использовать очень много кодов ошибок Http, и нет способов вернуть пользовательское сообщение об ошибке.
Чтобы уточнить, я имею в виду правильные исключительные ошибки, а не ожидаемые ошибки. Я хочу сообщить о проблеме пользователю, чтобы он мог определить, что ему нужно сделать, чтобы исправить ее.
Возможные варианты, которые я рассматриваю ...
Просто используйте коды ошибок Http - Кажется, это будет слишком ограничительным в том, что я могу выразить, и не позволит мне предоставить пользовательское сообщение. Пожалуйста (!) Поправьте меня, если я ошибаюсь.
Всегда возвращать Http Success, но возвращать пользовательские объекты ошибок - Очевидно, что наиболее гибкий, но, конечно, не самый RESTful.
Я был бы очень признателен, если бы кто-нибудь мог поделиться реальным опытом этой конкретной проблемы.
Обновление
Спасибо за предложение использовать свойство StatusDescription
объекта OutgoingWebResponseContext
. Сначала мне показалось, что я могу это использовать.
Я пришел к выводу, что мой второй вариант выше не для меня. Я хочу придерживаться того, что Http может дать мне.
У меня проблемы с тем, чтобы заставить его работать, однако. Независимо от значения, которое я предоставляю для этого свойства, оно не возвращается в ответе.
Мой метод обслуживания выглядит следующим образом
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
Соединение: Закрыть
Это не так, как будто мне просто нужно получить доступ к правильному свойству на клиенте. Информация просто не пересылается по ссылке.
Что на самом деле делает это свойство StatusDescription
Обновление
Я так и не узнал, как установить свойство StatusDescription. Я закончил тем, что не включил никаких сообщений об ошибках вообще, и пошел исключительно с кодами статуса Http. Я решил предоставить конечным точкам Soap и Restful для своих сервисов, чтобы клиенты могли выбирать, какие из них они предпочитают использовать - простые сообщения Restful или относительно более богатые сообщения Soap.