Практическое руководство. Импорт утверждений пользовательской политики
В утверждениях политики описываются возможности и требования конечной точки службы. Клиентские приложения могут использовать утверждения политики в метаданных службы для настройки привязки клиента или для настройки контракта службы для конечной точки службы.
Утверждения настраиваемой политики импортируются путем реализации интерфейса System.ServiceModel.Description.IPolicyImportExtension и передачи этого объекта системе метаданных или путем регистрации типа реализации в файле конфигурации приложения. IPolicyImportExtension Реализации интерфейса должны предоставлять конструктор без параметров.
Импорт утверждений настраиваемой политики
Реализуйте интерфейс System.ServiceModel.Description.IPolicyImportExtension в классе. См. описанные ниже действия.
Вставьте импортер настраиваемой политики одним из следующих способов:
Путем использования файла конфигурации. См. описанные ниже действия.
Использование файла конфигурации с помощью средства служебной программы метаданных ServiceModel (Svcutil.exe). См. описанные ниже действия.
Программным путем. См. описанные ниже действия.
Реализация интерфейса System.ServiceModel.Description.IPolicyImportExtension в любом классе
В методе IPolicyImportExtension.ImportPolicy для каждого интересующего субъекта политики найдите утверждения политики, которые требуется импортировать, вызвав соответствующий метод (в зависимости от требуемой области утверждения) объекта System.ServiceModel.Description.PolicyConversionContext, переданного методу. В следующем примере кода показано использование метода PolicyAssertionCollection.Remove для поиска утверждения настраиваемой политики и удаления его из коллекции за один шаг. Если использовать метод удаления для поиска и удаления утверждения, выполнять шаг 4 не потребуется.
// Locate the custom assertion and remove it. XmlElement customAssertion = context.GetBindingAssertions().Remove(name1, ns1); if (customAssertion != null) { Console.WriteLine( "Removed our custom assertion from the imported " + "assertions collection and inserting our custom binding element." ); // Here we would add the binding modification that implemented the policy. // This sample does not do this. Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(customAssertion.NamespaceURI + " : " + customAssertion.Name); Console.WriteLine(customAssertion.OuterXml); Console.ForegroundColor = ConsoleColor.Gray; }
' Locate the custom assertion and remove it. Dim customAssertion As XmlElement = context.GetBindingAssertions().Remove(name1, ns1) If customAssertion IsNot Nothing Then Console.WriteLine("Removed our custom assertion from the imported " & "assertions collection and inserting our custom binding element.") ' Here we would add the binding modification that implemented the policy. ' This sample does not do this. Console.ForegroundColor = ConsoleColor.Red Console.WriteLine(customAssertion.NamespaceURI & " : " & customAssertion.Name) Console.WriteLine(customAssertion.OuterXml) Console.ForegroundColor = ConsoleColor.Gray End If
Обработайте утверждения политики. Обратите внимание, что система политики не нормализует вложенные политики и
wsp:optional
. Эти конструкции необходимо обработать в реализации расширения импорта политики.Настройте привязку или контракт, поддерживающие возможность или требование, задаваемое утверждением политики. Как правило, в утверждениях указывается, что привязка требует определенной конфигурации или определенного элемента привязки. Внесите эти изменения, обратившись к свойству PolicyConversionContext.BindingElements. Другие утверждения требуют изменения контракта. Обратиться к контракту и внести в него изменения можно с помощью свойства PolicyConversionContext.Contract. Обратите внимание, что импортер политики может вызываться несколько раз для одной и той же привязки и контракта, однако для разных альтернативных политик, если импортировать альтернативную политику не удается. Код должен быть устойчив к такому поведению.
Удалите утверждение настраиваемой политики из коллекции утверждений. Если утверждение Windows Communication Foundation (WCF) не удаляется, предполагается, что импорт политики был неудачным и не импортирует связанную привязку. Если использовался метод PolicyAssertionCollection.Remove для поиска утверждения настраиваемой политики и удаления его из коллекции за один шаг, выполнять этот шаг не требуется.
Вставка импортера настраиваемой политики в систему метаданных с помощью файла конфигурации
Добавьте тип
<extensions>
импорта в элемент в <элемент policyImporters> в файле конфигурации клиента.<client> <endpoint address="http://localhost:8080/StatefulService" binding="wsHttpBinding" bindingConfiguration="CustomBinding_IStatefulService" contract="IStatefulService" name="CustomBinding_IStatefulService" /> <metadata> <policyImporters> <extension type="Microsoft.WCF.Documentation.CustomPolicyImporter, PolicyExtensions"/> </policyImporters> </metadata> </client>
В клиентском приложении используйте класс System.ServiceModel.Description.MetadataResolver или System.ServiceModel.Description.WsdlImporter для разрешения метаданных, и импортер будет вызываться автоматически.
// Download all metadata. ServiceEndpointCollection endpoints = MetadataResolver.Resolve( typeof(IStatefulService), new EndpointAddress("http://localhost:8080/StatefulService/mex") );
' Download all metadata. Dim endpoints As ServiceEndpointCollection = MetadataResolver.Resolve(GetType(IStatefulService), New EndpointAddress("http://localhost:8080/StatefulService/mex"))
Вставка импортера настраиваемой политики в систему метаданных с помощью Svcutil.exe
Добавьте тип
<extensions>
импорта в элемент в <элемент policyImporters> в файле конфигурации Svcutil.exe.config. Также можно с помощью параметра/svcutilConfig
дать Svcutil.exe указание загрузить типы импортеров политик, зарегистрированные в другом файле конфигурации.Используйте средство служебной программы метаданных ServiceModel (Svcutil.exe), чтобы импортировать метаданные, и импорт вызывается автоматически.
Вставка импортера настраиваемой политики в систему метаданных программным путем
- Добавьте импортер в свойство MetadataImporter.PolicyImportExtensions (например, если используется класс System.ServiceModel.Description.WsdlImporter), прежде чем импортировать метаданные.