Compartilhar via


IPolicyExportExtension Interface

Definição

Implementa IPolicyExportExtension para inserir declarações de política de associação personalizadas nas informações da WSDL (linguagem WSDL).

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

Exemplos

O exemplo de código a seguir mostra a implementação de IPolicyExportExtension em um BindingElement. Neste exemplo, um elemento de associação personalizada é anexado ao arquivo WSDL no nível de associação.

#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

O exemplo de código a seguir mostra uma System.ServiceModel.Configuration.BindingElementExtensionElement implementação que permite que o exportador de política anterior seja carregado de um arquivo de configuração de aplicativo.

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

O exemplo a seguir mostra o arquivo de configuração do host que carrega o exportador de política 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>

O exemplo a seguir mostra a asserção personalizada no arquivo 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="" />

Comentários

Implemente a IPolicyExportExtension interface em um System.ServiceModel.Channels.BindingElement objeto para gravar instruções sobre recursos ou requisitos de ponto de extremidade nas informações do WSDL expostas por um ponto de extremidade específico. Normalmente, o elemento de associação é aquele que implementa algum recurso, mas isso não é necessário. Para carregar o exportador de política de um arquivo de configuração, implemente um System.ServiceModel.Configuration.BindingElementExtensionElement que retorna o objeto exportador BindingElement de política.

O exportador de políticas é usado pelo WCF (Windows Communication Foundation) para usar declarações de política para comunicar aos clientes a existência desse requisito de associação personalizada ou capacidade de ponto de extremidade.

O ExportPolicy método usa os MetadataExporter objetos e PolicyConversionContext . Use os GetBindingAssertionsmétodos , GetMessageBindingAssertionse GetOperationBindingAssertions para obter coleções de declarações de política que já foram exportadas em vários escopos. Em seguida, adicione seu objeto de declaração de política personalizado à coleção apropriada.

A Contract propriedade expõe o ContractDescription para o ponto de extremidade que está sendo exportado. Isso permite que a IPolicyExportExtension extensão escopo corretamente suas declarações de política exportadas. Por exemplo, atributos de segurança no código podem adicionar comportamentos ao ContractDescription que indicam onde as declarações de política de segurança devem ser adicionadas.

O IPolicyExportExtension mecanismo só dá suporte à exportação de declarações de política no WSDL. Para exportar elementos WSDL personalizados, você deve usar o IWsdlExportExtension mecanismo para modificar o WSDL diretamente.

Depois que as declarações de política personalizadas forem anexadas às informações do WSDL, os clientes poderão detectar e importar as declarações de associação personalizadas usando um IPolicyImportExtension objeto .

Métodos

ExportPolicy(MetadataExporter, PolicyConversionContext)

Implementar na inclusão para exportar uma declaração de política personalizada sobre associações.

Aplica-se a