IPolicyExportExtension Interface

Définition

Implémentez IPolicyExportExtension pour insérer des assertions de stratégie de liaisons personnalisées dans les informations Web Services Description Language (WSDL).

public interface class IPolicyExportExtension
public interface IPolicyExportExtension
type IPolicyExportExtension = interface
Public Interface IPolicyExportExtension
Dérivé

Exemples

L'exemple de code suivant montre l'implémentation de l'IPolicyExportExtension sur un BindingElement. Dans cet exemple, un élément de liaison personnalisé est attaché au fichier WSDL au niveau de la liaison.

#region IPolicyExporter Members
public void ExportPolicy(MetadataExporter exporter, PolicyConversionContext policyContext)
{
  if (exporter == null)
    throw new NullReferenceException("The MetadataExporter object passed to the ExporterBindingElement is null.");
  if (policyContext == null)
    throw new NullReferenceException("The PolicyConversionContext object passed to the ExporterBindingElement is null.");

  XmlElement elem = doc.CreateElement(name1, ns1);
  elem.InnerText = "My custom text.";
  XmlAttribute att = doc.CreateAttribute("MyCustomAttribute", ns1);
  att.Value = "ExampleValue";
  elem.Attributes.Append(att);
  XmlElement subElement = doc.CreateElement("MyCustomSubElement", ns1);
  subElement.InnerText = "Custom Subelement Text.";
  elem.AppendChild(subElement);
  policyContext.GetBindingAssertions().Add(elem);
  Console.WriteLine("The custom policy exporter was called.");
}
#endregion
#Region "IPolicyExporter Members"
Public Sub ExportPolicy(ByVal exporter As MetadataExporter, ByVal policyContext As PolicyConversionContext) Implements IPolicyExportExtension.ExportPolicy
  If exporter Is Nothing Then
    Throw New NullReferenceException("The MetadataExporter object passed to the ExporterBindingElement is null.")
  End If
  If policyContext Is Nothing Then
    Throw New NullReferenceException("The PolicyConversionContext object passed to the ExporterBindingElement is null.")
  End If

  Dim elem As XmlElement = doc.CreateElement(name1, ns1)
  elem.InnerText = "My custom text."
  Dim att As XmlAttribute = doc.CreateAttribute("MyCustomAttribute", ns1)
  att.Value = "ExampleValue"
  elem.Attributes.Append(att)
  Dim subElement As XmlElement = doc.CreateElement("MyCustomSubElement", ns1)
  subElement.InnerText = "Custom Subelement Text."
  elem.AppendChild(subElement)
  policyContext.GetBindingAssertions().Add(elem)
  Console.WriteLine("The custom policy exporter was called.")
End Sub
#End Region

L'exemple de code suivant montre une implémentation System.ServiceModel.Configuration.BindingElementExtensionElement qui permet à l'exportateur de stratégie précédent d'être chargé à partir d'un fichier de configuration de l'application.

public class ExporterBindingElementConfigurationSection : BindingElementExtensionElement
{
  public ExporterBindingElementConfigurationSection()
  { Console.WriteLine("Exporter configuration section created."); }

  public override Type BindingElementType
  { get { return typeof(ExporterBindingElement); } }

  protected override BindingElement CreateBindingElement()
  { return new ExporterBindingElement(); }
}
Public Class ExporterBindingElementConfigurationSection
    Inherits BindingElementExtensionElement
  Public Sub New()
      Console.WriteLine("Exporter configuration section created.")
  End Sub

  Public Overrides ReadOnly Property BindingElementType() As Type
      Get
          Return GetType(ExporterBindingElement)
      End Get
  End Property

  Protected Overrides Function CreateBindingElement() As BindingElement
      Return New ExporterBindingElement()
  End Function
End Class

L'exemple suivant montre le fichier de configuration d'hôte qui charge l'exportateur de stratégie personnalisé.

<system.serviceModel>
  <services>
    <service 
      name="Microsoft.WCF.Documentation.StatefulService"
      behaviorConfiguration="addMetadata"
    >
      <host>
        <baseAddresses>
          <add baseAddress="http://localhost:8080/StatefulService"/>
        </baseAddresses>
      </host>
      <endpoint 
        address="http://localhost:8080/StatefulService" 
        binding="customBinding" 
        bindingConfiguration="exporter" 
        contract="Microsoft.WCF.Documentation.IStatefulService" 
      />
      <endpoint
        address="mex"
        binding="mexHttpBinding"
        contract="IMetadataExchange"
      />
    </service>
  </services>
  <behaviors>
    <serviceBehaviors>
      <behavior name="addMetadata">
        <serviceMetadata
           httpGetEnabled="true"
           httpGetUrl=""
         />
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <bindings>
    <customBinding>
      <!-- 
        Use the name attribute of the binding element as 
        the value of the bindingConfiguration attribute in 
        your endpoint.
      -->
      <binding name ="exporter">
        <!-- Use the name attribute of your binding element extension specified below. -->
        <!-- Be certain the order of your custom binding elements is correct. -->
        <exporterBinding />
        <reliableSession/>
        <textMessageEncoding messageVersion="Default" />
        <httpTransport/>
      </binding>
    </customBinding>
  </bindings>
  <extensions>
    <bindingElementExtensions>
      <!-- Use the add element to associate your bindingelement configuration handler and give it a name to use. -->
      <add 
        type="Microsoft.WCF.Documentation.ExporterBindingElementConfigurationSection,PolicyExtensions" 
        name="exporterBinding" />
    </bindingElementExtensions>
  </extensions>
</system.serviceModel>

L'exemple suivant montre l'assertion personnalisée dans le fichier WSDL.

<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"

  namespaces removed here for clarity...

>
  <wsp:Policy wsu:Id="CustomBinding_IStatefulService_policy">
    <wsp:ExactlyOne>
      <wsp:All>
        <acme 
          b:MyCustomAttribute="ExampleValue"
          xmlns="http://Microsoft/WCF/Documentation/CustomPolicyAssertions"           xmlns:b="http://Microsoft/WCF/Documentation/CustomPolicyAssertions">
           My custom text.
          <MyCustomSubElement>Custom Subelement Text.</MyCustomSubElement>
        </acme>
        <wsrm:RMAssertion xmlns:wsrm="http://schemas.xmlsoap.org/ws/2005/02/rm/policy">
          <wsrm:InactivityTimeout Milliseconds="600000" />
          <wsrm:AcknowledgementInterval Milliseconds="200" />
        </wsrm:RMAssertion>
        <wsaw:UsingAddressing />
      </wsp:All>
    </wsp:ExactlyOne>
  </wsp:Policy>
  <wsdl:import namespace="http://microsoft.wcf.documentation" location="" />

Remarques

Implémentez l’interface IPolicyExportExtension sur un objet System.ServiceModel.Channels.BindingElement pour écrire des instructions sur les possibilités ou les exigences de point de terminaison dans les informations WSDL exposées par un point de terminaison particulier. En général, l'élément de liaison est celui qui implémente des fonctionnalités, mais cela n'est pas obligatoire. Pour charger votre exportateur de stratégie à partir d'un fichier de configuration, implémentez un System.ServiceModel.Configuration.BindingElementExtensionElement qui retourne l'objet BindingElement de l'exportateur de stratégie.

L’exportateur de stratégie est utilisé par Windows Communication Foundation (WCF) pour utiliser des assertions de stratégie afin de communiquer aux clients l’existence de cette exigence de liaison personnalisée ou de cette fonctionnalité de point de terminaison.

La méthode ExportPolicy prend les objets MetadataExporter et PolicyConversionContext. Utilisez les méthodes GetBindingAssertions, GetMessageBindingAssertions et GetOperationBindingAssertions pour obtenir des collections d’assertions de stratégie qui ont déjà été exportées à différentes portées. Ajoutez ensuite votre objet d'assertions de stratégie personnalisées à la collection appropriée.

La propriété Contract expose la ContractDescription du point de terminaison qui est en cours d'exportation. Cela permet à l'extension IPolicyExportExtension de limiter correctement la portée de ses assertions de stratégie exportées. Par exemple, les attributs de sécurité du code peuvent ajouter des comportements à la ContractDescription qui indique l'emplacement où les assertions de stratégie de sécurité doivent être ajoutées.

Le mécanisme IPolicyExportExtension ne prend en charge que les assertions de stratégie d'exportation de WSDL. Pour exporter des éléments WSDL personnalisés, vous devez utiliser le mécanisme IWsdlExportExtension afin de modifier WSDL directement.

Une fois que les assertions de stratégie personnalisées ont été attachées aux informations WSDL, les clients peuvent détecter et importer les assertions de liaison personnalisées à l’aide d’un objet IPolicyImportExtension.

Méthodes

ExportPolicy(MetadataExporter, PolicyConversionContext)

Effectuez une implémentation pour inclure l’exportation d’une assertion de stratégie personnalisée sur les liaisons.

S’applique à