Подтвердить что ты не робот

Каков наилучший способ возврата ошибок из службы WCF с помощью RESTful?

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

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

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

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

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

  • Всегда возвращать Http-успех, но возвращать пользовательские объекты ошибок - очевидно, самый гибкий, но, конечно, не самый RESTful.

Я был бы очень признателен, если бы кто-нибудь мог поделиться каким-то реальным опытом в этой конкретной проблеме.


Update

Спасибо за предложение использовать свойство 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 Development Server/9.0.0.0
Дата: ср, 07 янв 2009 14:01:20 GMT
X-AspNet-Version: 2.0.50727
Кэш-контроль: частный
Content-Length: 0
Соединение: Закрыть

Это не так, как будто мне просто нужно получить доступ к правильному свойству на клиенте. Информация просто не отправляется по ссылке.

Что делает это свойство StatusDescription?


Update

Я никогда не узнал, как установить свойство StatusDescription. Я в конечном итоге не включал никаких сообщений об ошибках и шел исключительно с кодами состояния Http. Я решил разоблачить как конечные точки Soap, так и Restful для своих сервисов, и поэтому клиенты могут выбирать, какие они предпочитают использовать, - простые сообщения Restful или относительно более богатые сообщения Soap.

4b9b3361

Ответ 1

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

Ответ 3

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

Ответ 4

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

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

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

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