Поделиться через


Заголовки адресов

В примере заголовков адресов показано, как клиенты могут передавать ссылочные параметры службе с помощью 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".

Настройка, сборка и выполнение образца

  1. Убедитесь, что вы выполнили процедуру однократной установки для примеров Windows Communication Foundation.

  2. Чтобы создать выпуск решения на языке C# или Visual Basic .NET, следуйте инструкциям в разделе Building the Windows Communication Foundation Samples.

  3. Чтобы запустить пример в конфигурации с одним или несколькими компьютерами, следуйте инструкциям в разделе "Примеры Windows Communication Foundation".