Заголовки адресов
В примере заголовков адресов показано, как клиенты могут передавать ссылочные параметры службе с помощью Windows Communication Foundation (WCF).
Примечание.
Процедура настройки и инструкции по построению для данного образца приведены в конце этого раздела.
Спецификация WS-Addressing определяет понятие ссылки на конечную точку как способа обращения к определенной конечной точке веб-службы. В WCF ссылки на конечные точки моделиируются с помощью EndpointAddress
класса — EndpointAddress
это тип поля ServiceEndpoint
Address класса.
Особенностью модели ссылки на конечную точку является то, что каждая ссылка может содержать несколько ссылочных параметров, которые добавляют дополнительные идентификационные сведения. В WCF эти эталонные параметры моделироваются как экземпляры AddressHeader
класса.
В этом образце клиент добавляет ссылочный параметр в EndpointAddress
конечной точки клиента. Служба ищет этот ссылочный параметр и использует его значение в логике операции службы "Привет".
Клиент
Чтобы клиент мог отправить ссылочный параметр, он должен добавить заголовок AddressHeader
в адрес EndpointAddress
конечной точки ServiceEndpoint
. Поскольку класс EndpointAddress
является неизменным, изменение адреса конечной точки необходимо выполнить с помощью класса EndpointAddressBuilder
. В следующем коде клиент инициализируется для отправки ссылочного параметра как часть сообщения.
HelloClient client = new HelloClient();
EndpointAddressBuilder builder =
new EndpointAddressBuilder(client.Endpoint.Address);
AddressHeader header =
AddressHeader.CreateAddressHeader(IDName, IDNamespace, "John");
builder.Headers.Add(header);
client.Endpoint.Address = builder.ToEndpointAddress();
Код создает EndpointAddressBuilder
с использованием исходного EndpointAddress
в качестве первоначального значения. Затем он добавляет только что созданный заголовок адреса; Вызов CreateAddressHeader
для создания заголовка с определенным именем, пространством имен и значением. В этом случае значением является "John". После добавления заголовка в конструктор метод ToEndpointAddress()
преобразовывает (изменяемый) конструктор назад в (неизменяемый) адрес конечной точки, который снова присваивается полю адреса конечной точки клиента.
Теперь при вызове Console.WriteLine(client.Hello());
клиентом служба может получить значение этого параметра адреса, как показано в результирующих выходных данных клиента.
Hello, John
Сервер
Реализация операции службы Hello()
использует текущий OperationContext
для проверки значений заголовков входящего сообщения.
string id = null;
// look at headers on incoming message
for (int i = 0;
i < OperationContext.Current.IncomingMessageHeaders.Count;
++i)
{
MessageHeaderInfo h = OperationContext.Current.IncomingMessageHeaders[i];
// for any reference parameters with the correct name & namespace
if (h.IsReferenceParameter &&
h.Name == IDName &&
h.Namespace == IDNamespace)
{
// read the value of that header
XmlReader xr = OperationContext.Current.IncomingMessageHeaders.GetReaderAtHeader(i);
id = xr.ReadElementContentAsString();
}
}
return "Hello, " + id;
Код выполняет итерацию всех заголовков входящего сообщения, выполняя поиск заголовок, которые являются ссылочными параметрами с определенным именем. При нахождении параметра он считывает значение параметра и сохраняет его в переменной "id".
Настройка, сборка и выполнение образца
Убедитесь, что вы выполнили процедуру однократной установки для примеров Windows Communication Foundation.
Чтобы создать выпуск решения на языке C# или Visual Basic .NET, следуйте инструкциям в разделе Building the Windows Communication Foundation Samples.
Чтобы запустить пример в конфигурации с одним или несколькими компьютерами, следуйте инструкциям в разделе "Примеры Windows Communication Foundation".