Сделайте одну службу поддержки 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.
Любой способ обойти это?