Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В примере CustomMexEndpoint показано, как реализовать службу с безопасной конечной точкой метаданных, которая использует одну из привязок без обмена метаданными, а также как настроить Инструмент ServiceModel Metadata Utility (Svcutil.exe) или клиентов для получения метаданных из такой конечной точки метаданных. Существует две системные привязки, доступные для предоставления конечных точек метаданных: mexHttpBinding и mexHttpsBinding. mexHttpBinding используется для предоставления конечной точки метаданных по протоколу HTTP в незащищённом виде. mexHttpsBinding используется для безопасного предоставления конечной точки метаданных по протоколу HTTPS. В этом примере показано, как предоставить безопасную конечную точку метаданных с помощью .WSHttpBinding Это необходимо сделать, если вы хотите изменить параметры безопасности привязки, но не хотите использовать ПРОТОКОЛ HTTPS. Если вы используете конечную точку метаданных mexHttpsBinding, она будет безопасной, но изменить параметры привязки невозможно.
Замечание
Процедура установки и инструкции по сборке для этого примера находятся в конце этого раздела.
Услуга
В этом примере служба содержит две конечные точки. Конечная точка приложения обслуживает контракт ICalculator на WSHttpBinding с включенной функцией ReliableSession и безопасностью Message с помощью сертификатов. Конечная точка метаданных также использует WSHttpBindingте же параметры безопасности, но без ReliableSession. Ниже приведена соответствующая конфигурация:
<services>
<service name="Microsoft.ServiceModel.Samples.CalculatorService"
behaviorConfiguration="CalculatorServiceBehavior">
<!-- use base address provided by host -->
<endpoint address=""
binding="wsHttpBinding"
bindingConfiguration="Binding2"
contract="Microsoft.ServiceModel.Samples.ICalculator" />
<endpoint address="mex"
binding="wsHttpBinding"
bindingConfiguration="Binding1"
contract="IMetadataExchange" />
</service>
</services>
<bindings>
<wsHttpBinding>
<binding name="Binding1">
<security mode="Message">
<message clientCredentialType="Certificate" />
</security>
</binding>
<binding name="Binding2">
<reliableSession inactivityTimeout="00:01:00" enabled="true" />
<security mode="Message">
<message clientCredentialType="Certificate" />
</security>
</binding>
</wsHttpBinding>
</bindings>
Во многих других примерах конечная точка метаданных использует значение по умолчанию mexHttpBinding, которое не является безопасным. Здесь метаданные защищены с использованием WSHttpBinding при Message безопасности. Чтобы клиенты метаданных извлекали эти метаданные, их необходимо настроить с соответствующей привязкой. В этом примере показаны два таких клиента.
Первый клиент использует Svcutil.exe для получения метаданных и создания клиентского кода и конфигурации во время разработки. Так как служба использует привязку, не используемую по умолчанию для метаданных, средство Svcutil.exe должно быть специально настроено для получения метаданных из службы с помощью этой привязки.
Второй клиент использует MetadataResolver для динамического получения метаданных для известного контракта, а затем выполнения операций с динамически созданным клиентом.
Клиент Svcutil
При использовании привязки по умолчанию для хостинга вашей конечной IMetadataExchange точки, можно выполнить Svcutil.exe с указанием адреса этой конечной точки.
svcutil http://localhost/servicemodelsamples/service.svc/mex
и это работает. Но в этом примере сервер использует конечную точку, отличной от по умолчанию, для размещения метаданных. Поэтому Svcutil.exe необходимо указать использовать правильную привязку. Это можно сделать с помощью файла Svcutil.exe.config.
Файл Svcutil.exe.config выглядит как обычный файл конфигурации клиента. Единственными необычными аспектами являются имя и контракт клиентской конечной точки:
<endpoint name="http"
binding="wsHttpBinding"
bindingConfiguration="Binding1"
behaviorConfiguration="ClientCertificateBehavior"
contract="IMetadataExchange" />
Имя конечной точки должно быть именем схемы адреса, в котором размещаются метаданные, и контракт конечной точки должен быть IMetadataExchange. Таким образом, при запуске Svcutil.exe с помощью командной строки, например следующей:
svcutil http://localhost/servicemodelsamples/service.svc/mex
Он ищет конечную точку с именем "http" и контракт IMetadataExchange , чтобы настроить привязку и поведение обмена данными с конечной точкой метаданных. Остальная часть файла Svcutil.exe.config в примере указывает конфигурацию привязки и учетные данные поведения для сопоставления конфигурации сервера конечной точки метаданных.
Чтобы Svcutil.exe забрать конфигурацию в Svcutil.exe.config, Svcutil.exe должен находиться в том же каталоге, что и файл конфигурации. В результате необходимо скопировать Svcutil.exe из расположения установки в каталог, содержащий файл Svcutil.exe.config. Затем из этого каталога выполните следующую команду:
.\svcutil.exe http://localhost/servicemodelsamples/service.svc/mex
Ведущий ".\" гарантирует, что запускается копия Svcutil.exe в этом каталоге (которая имеет соответствующий Svcutil.exe.config).
Клиент MetadataResolver
Если клиент знает контракт и как взаимодействовать с метаданными во время разработки, клиент может динамически узнать привязку и адрес конечных точек приложения с помощью MetadataResolver. В этом примере клиент демонстрирует, как настраивать привязку и учетные данные, которые используются MetadataResolver, путем создания и настройки MetadataExchangeClient.
Те же сведения о привязке и сертификате, которые появились в Svcutil.exe.config, можно указать императивно в следующих MetadataExchangeClientпараметрах:
// Specify the Metadata Exchange binding and its security mode
WSHttpBinding mexBinding = new WSHttpBinding(SecurityMode.Message);
mexBinding.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;
// Create a MetadataExchangeClient for retrieving metadata, and set the // certificate details
MetadataExchangeClient mexClient = new MetadataExchangeClient(mexBinding);
mexClient.SoapCredentials.ClientCertificate.SetCertificate( StoreLocation.CurrentUser, StoreName.My,
X509FindType.FindBySubjectName, "client.com");
mexClient.SoapCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust;
mexClient.SoapCredentials.ServiceCertificate.SetDefaultCertificate( StoreLocation.CurrentUser, StoreName.TrustedPeople,
X509FindType.FindBySubjectName, "localhost");
С помощью настроенного mexClient мы можем перечислить контракты, которые нас интересуют, и использовать MetadataResolver для извлечения списка конечных точек с этими контрактами.
// The contract we want to fetch metadata for
Collection<ContractDescription> contracts = new Collection<ContractDescription>();
ContractDescription contract = ContractDescription.GetContract(typeof(ICalculator));
contracts.Add(contract);
// Find endpoints for that contract
EndpointAddress mexAddress = new EndpointAddress(ConfigurationManager.AppSettings["mexAddress"]);
ServiceEndpointCollection endpoints = MetadataResolver.Resolve(contracts, mexAddress, mexClient);
Наконец, мы можем использовать сведения из этих конечных точек для инициализации привязки и адреса используемого ChannelFactory для создания каналов для взаимодействия с конечными точками приложения.
ChannelFactory<ICalculator> cf = new ChannelFactory<ICalculator>(endpoint.Binding, endpoint.Address);
Ключевой точкой этого примера клиента является демонстрация того, что, если вы используете MetadataResolver, и необходимо указать пользовательские привязки или поведение для обмена данными метаданных, можно использовать MetadataExchangeClient для указания этих пользовательских параметров.
Для настройки и сборки примера
Убедитесь, что вы выполнили процедуру настройки One-Time для образцов Windows Communication Foundation.
Чтобы создать решение, следуйте инструкциям по созданию примеров Windows Communication Foundation.
Запуск примера на том же компьютере
Запустите Setup.bat из папки установки примера. При этом устанавливаются все сертификаты, необходимые для выполнения примера. Обратите внимание, что Setup.bat использует средство FindPrivateKey.exe, которое устанавливается путем выполнения setupCertTool.bat из установочной процедурыOne-Time для примеров Windows Communication Foundation.
Запустите клиентское приложение из \MetadataResolverClient\bin или \SvcutilClient\bin. Действие клиента отображается в клиентском консольном приложении.
Если клиент и служба не могут взаимодействовать, см. рекомендации по устранению неисправностей для примеров WCF.
Удалите сертификаты, выполнив Cleanup.bat после завершения работы с образцом. Другие примеры безопасности используют те же сертификаты.
Запуск примера на разных компьютерах
На сервере запустите
setup.bat service. При выполненииsetup.batс аргументомserviceсоздается сертификат службы, используя полное доменное имя компьютера, и затем этот сертификат экспортируется в файл с именем Service.cer.На сервере измените Web.config, чтобы отразить новое имя сертификата. То есть, измените
findValueатрибут в элементе <serviceCertificate> на полное квалифицированное доменное имя компьютера.Скопируйте файл Service.cer из каталога службы в клиентский каталог на клиентском компьютере.
На клиенте запустите
setup.bat client. При запускеsetup.batс аргументомclientсоздается клиентский сертификат с именем Client.com и экспортируется в файл с именем Client.cer.В файле App.config на клиентском компьютере
MetadataResolverClientизмените значение адреса конечной точки mex, чтобы оно соответствовало новому адресу вашего сервиса. Для этого замените localhost полным доменным именем сервера. Также замените "localhost" в файле metadataResolverClient.cs на новое имя сертификата службы (полностью квалифицированное доменное имя сервера). Выполните то же самое для элемента App.config проекта «SvcutilClient».Скопируйте файл Client.cer из клиентского каталога в каталог службы на сервере.
На клиенте запустите
ImportServiceCert.bat. При этом сертификат службы импортируется из файла Service.cer в хранилище CurrentUser — TrustedPeople.На сервере запустите
ImportClientCert.bat. Это импортирует сертификат клиента из файла Client.cer в хранилище LocalMachine — TrustedPeople.На компьютере службы создайте проект службы в Visual Studio и выберите страницу справки в веб-браузере, чтобы убедиться, что она запущена.
На клиентском компьютере запустите metadataResolverClient или SvcutilClient из VS.
- Если клиент и служба не могут взаимодействовать, см. рекомендации по устранению неисправностей для примеров WCF.
Очистка после образца
Запустите Cleanup.bat в папке примеров после завершения работы примера.
Замечание
Этот скрипт не удаляет сертификаты службы на клиенте при запуске этого примера на компьютерах. Если вы запускали примеры Windows Communication Foundation (WCF), использующие сертификаты между машинами, обязательно очистите сертификаты службы, установленные в хранилище CurrentUser — TrustedPeople. Для этого используйте следующую команду:
certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name>Например:certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.