IPolicyExportExtension Interfaz

Definición

Implemente IPolicyExportExtension para insertar las aserciones de directiva de enlace personalizadas en la información WSDL (Lenguaje de descripción de servicios Web).

public interface class IPolicyExportExtension
public interface IPolicyExportExtension
type IPolicyExportExtension = interface
Public Interface IPolicyExportExtension
Derivado

Ejemplos

El siguiente ejemplo de código muestra la implementación de IPolicyExportExtension en un BindingElement. En este ejemplo, se asocia un elemento de enlace personalizado al archivo WSDL en el nivel del enlace.

#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

El ejemplo de código siguiente muestra una implementación System.ServiceModel.Configuration.BindingElementExtensionElement que permite cargar el exportador de directivas anterior desde un archivo de configuración de la aplicación.

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

El siguiente ejemplo muestra el archivo de configuración host que carga al exportador de directivas personalizado.

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

El ejemplo siguiente muestra la aserción personalizada en el archivo 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="" />

Comentarios

Implemente la interfaz IPolicyExportExtension en un objeto System.ServiceModel.Channels.BindingElement para escribir las instrucciones sobre las capacidades o requisitos del punto de conexión en la información WSDL expuesta por un punto de conexión determinado. Normalmente, el elemento de enlace es aquel que implementa alguna característica, pero no es necesario. Para cargar el exportador de directivas desde un archivo de configuración, implemente un System.ServiceModel.Configuration.BindingElementExtensionElement que devuelve el objeto BindingElement del exportador de directivas.

Windows Communication Foundation (WCF) usa el exportador de directivas para comunicar a los clientes la existencia de ese requisito de enlace personalizado o la funcionalidad del punto de conexión.

El método ExportPolicy toma MetadataExporter y los objetos PolicyConversionContext. Utilice GetBindingAssertions, GetMessageBindingAssertions, y los métodos GetOperationBindingAssertions para obtener colecciones de aserciones de directiva que ya se han exportado a varios ámbitos. A continuación, agregue su objeto de aserción de directiva personalizado a la colección adecuada.

La propiedad Contract expone ContractDescription para el extremo que se exporta. Esto permite a la extensión IPolicyExportExtension definir correctamente el ámbito de las aserciones de directiva exportadas. Por ejemplo, los atributos de seguridad del código pueden agregar comportamientos a ContractDescription que indiquen donde deben agregarse las aserciones de la directiva de seguridad.

El mecanismo IPolicyExportExtension sólo permite exportar las aserciones de directiva en WSDL. Para exportar elementos WSDL personalizados, utilice el mecanismo IWsdlExportExtension para modificar directamente el WSDL.

Una vez asociadas las aserciones de directiva personalizadas a la información del WSDL, los clientes pueden detectar e importar las aserciones de enlace personalizadas mediante un objeto IPolicyImportExtension.

Métodos

ExportPolicy(MetadataExporter, PolicyConversionContext)

Implemente para incluir y exportar una aserción de directiva personalizada sobre los enlaces.

Se aplica a