Сделайте одну службу поддержки WCF как SOAP, REST, так и WSDL

Я пытаюсь создать службу С# в .NET 3.5, которая поддерживает как SOAP, так и показывает WSDL - и REST.

Служба SOAP и генерация WSDL были достаточно легкими для использования с классами ServiceHost и BasicHttpBinding. Получил, что работа и клиент были счастливы.

Поскольку SOAP вызывает все используемые простые параметры, разработчики-клиенты запросили интерфейс REST для некоторых из команд. Поэтому я изменил класс ServiceHost на WebServiceHost, добавил необходимые атрибуты WebInvoke и WebGet, добавил класс WebHttpBinding и bingo - REST и SOAP, оба работали из одной службы. Путь круто, измените один интерфейс, и оба REST и SOAP получили новый материал.

Но одна проблема - WSDL больше не генерируется. Я не мог найти http://server/service?wsdl и получить файл WSDL. Проверка документов MSDN, которая выглядит как поведение по умолчанию WebServiceHost.

Вопрос: могу ли я переопределить это поведение, чтобы получить WSDL? Не имеет того же URL-адреса, что и раньше, - он может измениться - но мне просто нужно иметь некоторый URL-адрес для обслуживания WSDL для этих разработчиков SOAP.

Ответ 1

Когда вы говорите "добавлен класс WebHttpBinding", похоже, что вы выполняете большую часть конфигурации в коде, а не в файлах конфигурации.

Если это так, вы можете попробовать переместить конфигурацию в файл конфигурации. Затем создайте 2 конечных точки для контракта один REST и один SOAP с двумя разными адресами и привязками.

Ответ 2

Но одна проблема - WSDL больше не генерируется. Я не мог найти http://server/service?wsdl и получить WSDL файл. Проверка документов MSDN, это, по-видимому, поведение для по умолчанию WebServiceHost.

Да - это один из недостатков REST - не более WSDL, не более машиносчитываемое описание сервиса. Вы должны надеяться, что поставщик услуг предоставит вам полезную и актуальную документацию о том, что вы можете сделать.

Нет времени WSDL для периода REST. Не может быть включен или что-то еще - его просто не существует.

В настоящее время предпринимаются некоторые усилия по обеспечению чего-то подобного: WADL (Язык описания веб-приложений), но насколько я знаете, он все еще далек от установленного стандарта любыми способами. Также см.: Нужен ли нам WADL?

Ответ 3

Circa, 2007, WSDL v2.0 должен иметь возможность описывать службы RESTful. Я обнаружил, что с WCF в .Net v4.0, что WDSL, сгенерированный из службы исключительно RESTful, недействителен (WSDL v1.0?).

Я создал аналогичный проект, который предоставляет как конечные точки SOAP, так и RESTful, и включил это, как и вы, в качестве модификатора интерфейса:

    // Get all Categories - complex object response
    [OperationContract]                             // categories
    [WebGet(BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "GetAllCategories")]
    CategoryCollection GetAllCategories();          // SubSonic object
    [OperationContract]                             // categories - respond with a JSON object
    [WebGet(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "GetAllCategories.JSON")]
    CategoryCollection GetAllCategoriesJSON();      // SubSonic object

Одно из предостережений заключается в том, что все входные параметры теперь должны иметь строку типа для всех запросов SOAP.

Любой способ обойти это?