Каков наилучший способ вернуть ошибки из службы WCF RESTful? - PullRequest
34 голосов
/ 06 января 2009

Использование WCF в режиме RESTful кажется великолепным. Я большой поклонник больших пушек, таких как простота и гибкость, но мне также нравится, как выглядят урлы. Что я могу сказать, я программист.

Простой API для поиска и редактирования ресурсов сопровождается почти одинаково простым набором возможных ответов об ошибках, и я не могу удержаться от ощущения, что, придерживаясь «чистого» подхода RESTful, я, возможно, отрезаю себе нос, несмотря на это. лицом, или, более конкретно, носом моих потребителей веб-услуг. Я могу ошибаться, но, похоже, я не могу использовать очень много кодов ошибок Http, и нет способов вернуть пользовательское сообщение об ошибке.

Чтобы уточнить, я имею в виду правильные исключительные ошибки, а не ожидаемые ошибки. Я хочу сообщить о проблеме пользователю, чтобы он мог определить, что ему нужно сделать, чтобы исправить ее.

Возможные варианты, которые я рассматриваю ...

  1. Просто используйте коды ошибок Http - Кажется, это будет слишком ограничительным в том, что я могу выразить, и не позволит мне предоставить пользовательское сообщение. Пожалуйста (!) Поправьте меня, если я ошибаюсь.

  2. Всегда возвращать 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.

Ответы [ 5 ]

21 голосов
/ 30 декабря 2011

С .net 4, выбросить WebFaultException<T>(T errorDetail, HttpResponseCodecode)

Здесь вы устанавливаете тип ответа на другой тип объекта, который имеет смысл, а также вы устанавливаете ResponseCode, который вы хотите.

errorDetail должен быть сериализуемым

http://blogs.msdn.com/b/endpoint/archive/2010/01/21/error-handling-in-wcf-webhttp-services-with-webfaultexception.aspx

8 голосов
/ 06 января 2009

Отправьте правильный код ответа, и вы можете указать свое сообщение об ошибке в теле ответа.

5 голосов
/ 16 апреля 2009

Я добавляю код ошибки как выше (в описании статуса), так и в тело возвращаемой страницы в моих службах 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;
2 голосов
/ 06 января 2009

См. в этой теме для аналогичного вопроса.

Короче говоря, я полагаю, что вы можете установить код состояния HTTP (один из кодов ошибок) и предоставить свое собственное сообщение в свойстве StatusDescription :

OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
response.StatusCode = System.Net.HttpStatusCode.Forbidden;
response.StatusDescription = "Custom";

К сожалению, я не знаю много о распространенности этой техники в реальном мире.

0 голосов
/ 11 ноября 2011

Это может быть дефект. По состоянию на 22.09.2011 команда продукта занимается рассмотрением проблемы:

http://connect.microsoft.com/VisualStudio/feedback/details/690162/wcf-rest-custom-outgoingwebresponsecontext-statusdescription-not-returned-in-response

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...