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


Несколько конечных точек по одному ListenUri

В этом образце показана служба, в которой размещается несколько конечных точек по одному адресу ListenUri. Данный образец основан на образце Образец для начала работы, реализующем службу калькулятора.

Aa395210.note(ru-ru,VS.100).gifПримечание
Процедура настройки и инструкции по построению для данного образца приведены в конце этого раздела.

Как показано в образце Несколько конечных точек, служба может содержать несколько конечных точек, каждая из которых имеет различные адреса и, возможно, различные привязки. В этом образце показано, что можно разместить несколько конечных точек по одному адресу. Кроме того, в этом образце демонстрируются различия между двумя видами адресов конечной точки службы: EndpointAddress и ListenUri.

EndpointAddress является логическим адресом службы. Это адрес, по которому отправляются сообщения SOAP. ListenUri является физическим адресом службы. В нем содержится информация о порте и адресе, где конечная точка службы фактически прослушивает сообщения на текущем компьютере. В большинстве случаев эти адреса не должны отличаться; если ListenUri не указан явно, по умолчанию используется URI из адреса EndpointAddress конечной точки. В некоторых случаях, например при настройке маршрутизатора, который может принимать сообщения, адресованные нескольким различным службам, эти адреса полезно различать.

Служба

Служба в образце имеет два контракта: ICalculator и IEcho. Кроме обычной конечной точки IMetadataExchange существуют три конечные точки приложения, как показано в следующем коде.

<endpoint address="urn:Stuff"
        binding="wsHttpBinding"
        contract="Microsoft.ServiceModel.Samples.ICalculator" 
        listenUri="https://localhost/servicemodelsamples/service.svc" />
<endpoint address="urn:Stuff"
        binding="wsHttpBinding"
        contract="Microsoft.ServiceModel.Samples.IEcho" 
        listenUri="https://localhost/servicemodelsamples/service.svc" />
<endpoint address="urn:OtherEcho"
        binding="wsHttpBinding"
        contract="Microsoft.ServiceModel.Samples.IEcho" 
        listenUri="https://localhost/servicemodelsamples/service.svc" />

Все три конечные точки размещаются по одному адресу ListenUri и используют одну привязку (binding) — конечные точки, расположенные по одному адресу ListenUri, должны иметь одну и ту же привязку, поскольку они совместно используют один стек каналов, который прослушивает сообщения в расположении, определенном данным физическим адресом на компьютере. Адрес (address) каждой конечной точки является универсальным именем ресурса (URN); несмотря на то что обычно адреса представляют физические расположения, фактически, адресом может быть URI любого вида, поскольку адрес используется для сопоставления и фильтрации, как показано в данном образце.

Поскольку все три конечные точки совместно используют один ListenUri, при поступлении сообщения по этому адресу Windows Communication Foundation (WCF) необходимо решить, для какой конечной точки оно предназначено. Каждая конечная точка имеет фильтр сообщений, состоящий из двух частей: фильтр адресов и фильтр контрактов. Фильтр адресов сопоставляет значение поля To сообщения SOAP с адресом конечной точки службы. Например, только сообщения с адресацией To "Urn:OtherEcho" являются кандидатами для третьей конечной точки данной службы. Фильтр контрактов соответствует действиям, связанным с операциями конкретного контракта. Пример: сообщения с действием IEcho. Echo соответствует фильтрам контрактов второй и третьей конечных точек данной службы, поскольку обе эти конечные точки содержат контракт IEcho.

Таким образом, комбинация фильтра адресов и фильтра контрактов позволяет направлять каждое сообщение, поступающее по адресу ListenUri данной службы, в правильную конечную точку. Третья конечная точка отличается от других двух, поскольку она принимает сообщения, отправляемые по другому адресу из других конечных точек. Первая и вторая конечные точки отличаются друг от друга своими контрактами (действием исходящего сообщения).

Клиент

Как и в случае конечных точек сервера у конечных точек клиента имеется два адреса. Логический адрес на сервере и на клиенте называется EndpointAddress. Однако на сервере физический адрес называется ListenUri, в то время как на клиенте он называется Via.

Аналогично серверу по умолчанию эти два адреса одинаковы. Для задания на клиенте адреса Via, отличающегося от адреса конечной точки, используется ClientViaBehavior:

Uri via = new Uri("https://localhost/ServiceModelSamples/service.svc");
CalculatorClient calcClient = new CalculatorClient();
calcClient.ChannelFactory.Endpoint.Behaviors.Add(
        new ClientViaBehavior(via));

Как обычно, адрес поступает из файла конфигурации клиента, созданного с помощью средства Svcutil.exe. Адрес Via (который соответствует ListenUri службы) не отображается в метаданных службы, таким образом, эту информацию необходимо передать клиенту вне диапазона (аналогично адресу метаданных службы).

В этом образце клиент отправляет сообщения каждой из трех конечных точек приложения, чтобы показать, что он может взаимодействовать со всеми тремя конечными точками (и различать их), даже если они имеют один и тот же адрес Via.

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

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

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

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

    Aa395210.note(ru-ru,VS.100).gifПримечание
    В случае нескольких компьютеров в файле Client.cs необходимо заменить localhost именем компьютера службы.

Aa395210.Important(ru-ru,VS.100).gif Примечание
Образцы уже могут быть установлены на компьютере. Перед продолжением проверьте следующий каталог (по умолчанию).

<диск_установки>:\WF_WCF_Samples

Если этот каталог не существует, перейдите на страницу Образцы Windows Communication Foundation (WCF) и Windows Workflow Foundation (WF) для .NET Framework 4, чтобы загрузить все образцы Windows Communication Foundation (WCF) и WF. Этот образец расположен в следующем каталоге.

<диск_установки>:\WF_WCF_Samples\WCF\Basic\Services\MultipleEndpointsSingleUri