Маршрутизация по телу сообщения
В примере RouteByBody показано, как реализовать службу, которая принимает объекты сообщений с любым действием SOAP. Этот пример основан на начале работы , который реализует службу калькулятора. Служба реализует одну операцию Calculate
, которая принимает параметр запроса Message и возвращает ответ Message.
В этом образце клиентом является консольное приложение (EXE), а служба размещается в службах IIS.
Примечание.
Процедура настройки и инструкции по построению для данного образца приведены в конце этого раздела.
Этот образец демонстрирует диспетчеризацию сообщений на основе содержимого тела сообщения. Встроенный механизм отправки сообщений модели службы Windows Communication Foundation (WCF) основан на действиях сообщений. Однако есть много существующих веб-служб, которые для всех своих операций определяют параметр Action="". Невозможно построить службу на основе кода WSDL, когда диспетчеризация сообщений запросов осуществляется на основе параметра Action. В этом образце показан контракт службы, основанный на коде WSDL (код WSDL содержится в файле Service.wsdl, который входит в этот образец). Контракт службы — калькулятор, аналогичный тому, который используется в начале работы. Однако контракт [OperationContract]
задает для всех операций Action=""
.
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples"),
XmlSerializerFormat, DispatchByBodyBehavior]
public interface ICalculator
{
[OperationContract(Action="")]
double Add(double n1, double n2);
[OperationContract(Action = "")]
double Subtract(double n1, double n2);
[OperationContract(Action = "")]
double Multiply(double n1, double n2);
[OperationContract(Action = "")]
double Divide(double n1, double n2);
}
Чтобы при таком контракте можно было распределять сообщения между операциями, службе требуется пользовательское поведение диспетчеризации DispatchByBodyBehavior
. Это поведение диспетчера инициализирует DispatchByBodyElementOperationSelector
селектор настраиваемых операций с таблицей имен операций, ключом QName соответствующих элементов оболочки. Операция DispatchByBodyElementOperationSelector
проверяет начальный тег первого дочернего элемента Body и выбирает операцию, используя упомянутую ранее таблицу.
Клиент использует автоматически созданный прокси-сервером из WSDL, экспортированного службой с помощью средства служебной программы метаданных ServiceModel (Svcutil.exe).
svcutil.exe /n:http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples /uxs http://localhost/servicemodelsamples/service.svc?wsdl /out:generatedProxy.cs
Тот факт, что параметры Action всех операций пусты, не влияет на клиентский код, не считая параметров Action автоматически созданного прокси.
Клиентский код выполняет несколько вычислений. При выполнении примера запросы и ответы операций отображаются в окне консоли клиента. Чтобы закрыть клиент, нажмите клавишу ВВОД в окне клиента.
Add(100, 15.99) = 115.99
Subtract(145, 76.54) = 68.46
Multiply(9, 81.25) = 731.25
Divide(22, 7) = 3.14285714285714
Press <ENTER> to terminate client.
Настройка, сборка и выполнение образца
Убедитесь, что вы выполнили процедуру однократной установки для примеров Windows Communication Foundation.
Чтобы создать решение, следуйте инструкциям по созданию примеров Windows Communication Foundation.
Чтобы запустить пример в конфигурации с одним или несколькими компьютерами, следуйте инструкциям в разделе "Примеры Windows Communication Foundation".