Маршрутизация по тексту сообщения
В этом образце показано, как реализовать службу, которая принимает объекты сообщений с действием SOAP. Данный образец основан на образце Образец для начала работы, реализующем службу калькулятора. Служба реализует одну операцию Calculate
, которая принимает параметр запроса Message и возвращает ответ Message.
В этом образце клиентом является консольное приложение (EXE), а служба размещается в службах IIS.
![]() |
---|
Процедура установки и инструкции по построению для данного образца расположены в конце этого раздела. |
Этот образец демонстрирует диспетчеризацию сообщений на основе содержимого тела сообщения. Встроенный механизм диспетчеризации сообщений модели службы Windows Communication Foundation (WCF) основан на параметрах Action сообщений. Однако есть много существующих веб-служб, которые для всех своих операций определяют параметр Action="". Невозможно построить службу на основе кода WSDL, когда диспетчеризация сообщений запросов осуществляется на основе параметра Action. В этом образце показан контракт службы, основанный на коде WSDL (код WSDL содержится в файле Service.wsdl, который входит в этот образец). Контракт службы — Calculator, он аналогичен контракту, используемому в образце Образец для начала работы. Однако контракт [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 Metadata Utility Tool (Svcutil.exe).
svcutil.exe /n:http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples /uxs https://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.
Чтобы выполнить образец на одном или нескольких компьютерах, следуйте инструкциям в разделе Running the Windows Communication Foundation Samples.
![]() |
---|
Образцы уже могут быть установлены на компьютере. Перед продолжением проверьте следующий каталог (по умолчанию).
<диск_установки>:\WF_WCF_Samples
Если этот каталог не существует, перейдите на страницу Образцы Windows Communication Foundation (WCF) и Windows Workflow Foundation (WF) для .NET Framework 4, чтобы загрузить все образцы Windows Communication Foundation (WCF) и WF. Этот образец расположен в следующем каталоге.
<диск_установки>:\WF_WCF_Samples\WCF\Extensibility\Interop\RouteByBody
|