Нетипизированный запрос/ответ
В этом образце показано, как определять контракты операций, использующие класс Message.
![]() |
---|
Процедура установки и инструкции по построению для данного образца расположены в конце этого раздела. |
Данный образец основан на образце Образец для начала работы. Контракт службы определяет одну операцию, которая принимает в качестве аргумента тип сообщения и возвращает сообщение. Операция собирает необходимые данные, чтобы вычислять сумму на основе тела сообщения, а затем отправляет эту сумму в виде тела ответного сообщения.
[OperationContract(Action = CalculatorService.RequestAction, ReplyAction = CalculatorService.ReplyAction)]
Message ComputeSum(Message request);
На стороне службы операция извлекает массив целых значений, переданный в качестве входного сообщения, и вычисляет сумму. Чтобы отправить ответное сообщение, образец создает новое сообщение с соответствующей версией сообщения и параметром Action и добавляет в качестве тела сообщения вычисленную сумму. Это показано в следующем образце кода.
public Message ComputeSum(Message request)
{
//The body of the message contains a list of numbers which will be
//read as a int[] using GetBody<T>
int result = 0;
int[] inputs = request.GetBody<int[]>();
foreach (int i in inputs)
{
result += i;
}
Message response = Message.CreateMessage(request.Version,
ReplyAction, result);
return response;
}
Клиент использует код, созданный с помощью средства Служебное средство ServiceModel Metadata Utility Tool (Svcutil.exe), чтобы создать прокси для удаленной службы. Чтобы отправить сообщение запроса, клиенту требуется версия сообщения, которая зависит от соответствующего канала. Таким образом, он создает новую область OperationContextScope, соответствующую созданному каналу прокси и создающую контекст OperationContext с правильной версией сообщения, подставленной в свойство OutgoingMessageHeaders.MessageVersion
. Клиент передает входящий массив в виде тела сообщения запроса, а затем вызывает метод ComputeSum
прокси. После этого клиент извлекает сумму входных данных через метод GetBody<T>
ответного сообщения. Это показано в следующем образце кода.
using (new OperationContextScope(client.InnerChannel))
{
// Call the Sum service operation.
int[] values = { 1, 2, 3, 4, 5 };
Message request = Message.CreateMessage(
OperationContext.Current.OutgoingMessageHeaders.MessageVersion,
RequestAction, values);
Message reply = client.ComputeSum(request);
int response = reply.GetBody<int>();
Console.WriteLine("Sum of numbers passed (1,2,3,4,5) = {0}",
response);
}
Этот образец размещается на веб-сервере, поэтому нужно запускать только клиентский исполняемый файл. Ниже показан образец вывода клиента.
Prompt>Client.exe
Sum of numbers passed (1,2,3,4,5) = 15
Press <ENTER> to terminate client.
Этот образец размещается на веб-сервере, поэтому проверьте указанную на шаге 3 ссылку, чтобы узнать, как выполнять построение и запуск образца.
Настройка, построение и выполнение образца
Убедитесь, что выполнены процедуры, описанные в разделе Процедура однократной настройки образцов Windows Communication Foundation.
Чтобы выполнить построение версии решения для языка C# или Visual Basic .NET, следуйте инструкциям раздела Построение образцов 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\Basic\Contract\Message\Untyped
|