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

StackOverflow https://stackoverflow.com/questions/417632

Вопрос

Использование 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 должен быть сериализуемым

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

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top