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


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

В примере заголовков адресов показано, как клиенты могут передавать ссылочные параметры службе с помощью Windows Communication Foundation (WCF).

Замечание

Процедура установки и инструкции по сборке для этого примера находятся в конце этого раздела.

Спецификация WS-Addressing определяет понятие ссылки на конечную точку в качестве способа решения конкретной конечной точки веб-службы. В WCF ссылки на конечные точки моделируются с помощью класса EndpointAddressEndpointAddress является типом поля Address класса ServiceEndpoint.

Часть эталонной модели конечной точки заключается в том, что каждая ссылка может содержать некоторые эталонные параметры, добавляющие дополнительные сведения об идентификации. В WCF эти эталонные параметры моделироваются как экземпляры AddressHeader класса.

В этом примере клиент добавляет ссылочный параметр в клиентскую конечную точку EndpointAddress. Служба ищет этот ссылочный параметр и использует его значение в логике операции службы Hello.

Клиент

Чтобы клиент мог отправить ссылочный параметр, он должен добавить 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 для создания заголовка с определенным именем, пространством имен и значением. Значение здесь – "Джон". После добавления заголовка в построитель, метод 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. Убедитесь, что вы выполнили процедуру настройки One-Time для образцов Windows Communication Foundation.

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

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