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


IPolicyImportExtension Интерфейс

Определение

Определяет метод для объектов, которые импортируют утверждения настраиваемой политики о привязках.

public interface class IPolicyImportExtension
public interface IPolicyImportExtension
type IPolicyImportExtension = interface
Public Interface IPolicyImportExtension
Производный

Примеры

В следующем примере кода показано применение метода PolicyAssertionCollection.Remove для расположения, возвращения и удаления утверждения за один шаг.

  #region IPolicyImporter Members
  public const string name1 = "acme";
  public const string ns1 = "http://Microsoft/WCF/Documentation/CustomPolicyAssertions";

  /*
   * Importing policy assertions usually means modifying the bindingelement stack in some way
   * to support the policy assertion. The procedure is:
   * 1. Find the custom assertion to import.
   * 2. Insert a supporting custom bindingelement or modify the current binding element collection
   *     to support the assertion.
   * 3. Remove the assertion from the collection. Once the ImportPolicy method has returned,
   *     any remaining assertions for the binding cause the binding to fail import and not be
   *     constructed.
   */
  public void ImportPolicy(MetadataImporter importer, PolicyConversionContext context)
  {
    Console.WriteLine("The custom policy importer has been called.");
    // 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;
    }
 }
#endregion
    #Region "IPolicyImporter Members"
    Public Const name1 As String = "acme"
    Public Const ns1 As String = "http://Microsoft/WCF/Documentation/CustomPolicyAssertions"

'    
'     * Importing policy assertions usually means modifying the bindingelement stack in some way
'     * to support the policy assertion. The procedure is:
'     * 1. Find the custom assertion to import.
'     * 2. Insert a supporting custom bindingelement or modify the current binding element collection
'     *     to support the assertion.
'     * 3. Remove the assertion from the collection. Once the ImportPolicy method has returned, 
'     *     any remaining assertions for the binding cause the binding to fail import and not be 
'     *     constructed.
'     
    Public Sub ImportPolicy(ByVal importer As MetadataImporter, ByVal context As PolicyConversionContext) Implements IPolicyImportExtension.ImportPolicy
      Console.WriteLine("The custom policy importer has been called.")
      ' 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
    End Sub
  #End Region

В следующем примере кода показан файл конфигурации клиентского приложения для загрузки средства импорта настраиваемой политики при вызове System.ServiceModel.Description.MetadataResolver.

<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>

В следующем примере кода показано применение MetadataResolver для загрузки и разрешения метаданных в объекты описания.

// 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"))

Комментарии

Реализуйте интерфейс IPolicyImportExtension для поиска сведений языка WSDL, предоставленных определенной конечной точкой для утверждений пользовательской политики о возможностях и требованиях конечной точки. Обычно средство импорта политики производит поиск конкретного утверждения и вставляет элемент привязки, настраивает элемент привязки или изменяет контракт для поддержки требований утверждения.

В отличие от аналога, IPolicyExportExtension, IPolicyImportExtension не требует реализации объектом BindingElement; его можно загрузить с помощью раздела конфигурации клиента, показанного в разделе «Пример», или программным образом путем добавления к конструктору System.ServiceModel.Description.WsdlImporter.

Windows Communication Foundation (WCF) передает в метод два объекта ImportPolicy : MetadataImporter и PolicyConversionContext. Обычно в объекте PolicyConversionContext уже содержатся утверждения политики для каждой области привязки.

Реализация IPolicyImportExtension выполняет следующие действия:

  1. Располагает утверждение настраиваемой политики, за которое она отвечает, путем вызова методов GetBindingAssertions, GetMessageBindingAssertions или GetOperationBindingAssertions, в зависимости от области.

  2. Удаляет утверждение политики из коллекции утверждений. Метод PolicyAssertionCollection.Remove располагает, возвращает и удаляет утверждение за один шаг.

  3. Измените стек привязок или контракт путем добавления необходимого настраиваемого объекта BindingElement в свойство BindingElements или путем изменения свойства PolicyConversionContext.Contract.

Шаг 2 является важным. После вызова всех импортеров политик WCF проверяет наличие оставшихся утверждений политики. Если он существует, WCF предполагает, что импорт политики был неудачным, и не импортирует связанную привязку.

Важно!

Поставщик вредоносных метаданных может попытаться отправить неправильно сформированное XML как часть метаданных в попытке воспользоваться средством импорта политики. Настоятельно рекомендуется, чтобы средства импорта настраиваемой политики были надежными для всех форм XML, передача которых возможна.

Настраиваемые реализации MetadataImporter должны реализовать свой собственный объект PolicyConversionContext для извлечения утверждений политики, прикрепленных к формату настраиваемых метаданных.

При необходимости в экспорте и импорте настраиваемых элементов WSDL, не являющихся утверждениями политики, см. разделы System.ServiceModel.Description.IWsdlExportExtension и System.ServiceModel.Description.IWsdlImportExtension.

Примечание

Вы можете использовать настраиваемые средства импорта и экспорта политик с служебной программой метаданных ServiceModel (Svcutil.exe), используя те же элементы конфигурации в файле конфигурации и параметре /svcutilConfig:<configFile> .

Методы

ImportPolicy(MetadataImporter, PolicyConversionContext)

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

Применяется к