Создайте одну службу WCF, поддерживающую SOAP, REST и WSDL - PullRequest
11 голосов
/ 13 ноября 2009

Я пытаюсь создать службу C # в .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.

Ответы [ 3 ]

4 голосов
/ 14 ноября 2009

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

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

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

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

4 голосов
/ 13 ноября 2009

Когда вы говорите «добавил класс WebHttpBinding», это звучит так, как будто вы делаете большую часть конфигурации в коде, а не в файлах конфигурации.

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

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

Около 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

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

Есть ли способ обойти это?

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