Aracılığıyla paylaş


Nasıl yapılır: Özel İlke Onaylamalarını Dışa Aktarma

İlke onayları, bir hizmet uç noktasının özelliklerini ve gereksinimlerini açıklar. Hizmet uygulamaları uç nokta, bağlama veya sözleşme özelleştirme bilgilerini istemci uygulamasına iletmek için hizmet meta verilerinde özel ilke onaylarını kullanabilir. İletişimde bulunduğunuz özelliklere veya gereksinimlere bağlı olarak, uç nokta, işlem veya ileti konularındaki WSDL bağlamalarına eklenen ilke ifadelerindeki onayları dışarı aktarmak için Windows Communication Foundation'ı (WCF) kullanabilirsiniz.

Özel ilke onayları, arabirimi bir System.ServiceModel.Channels.BindingElement üzerinde uygulanarak System.ServiceModel.Description.IPolicyExportExtension ve bağlama öğesi doğrudan hizmet uç noktasının bağlamasına eklenerek veya bağlama öğesi uygulama yapılandırma dosyanıza kaydedilerek dışarı aktarılır. İlke dışarı aktarma uygulamanız, özel ilke onayınızı yöntemine geçirilen ExportPolicy üzerinde System.ServiceModel.Description.PolicyConversionContext uygun System.ServiceModel.Description.PolicyAssertionCollection olan örnek olarak System.Xml.XmlElement eklemelidir.

Ayrıca sınıfın PolicyVersionWsdlExporter özelliğini denetlemeniz ve belirtilen ilke sürümüne göre iç içe ilke ifadelerini ve ilke çerçevesi özniteliklerini doğru ad alanında dışarı aktarmanız gerekir.

Özel ilke onaylarını içeri aktarmak için bkz System.ServiceModel.Description.IPolicyImportExtension . ve Nasıl yapılır: Özel İlke Onaylarını İçeri Aktarma.

Özel ilke onaylarını dışarı aktarmak için

  1. arabirimini System.ServiceModel.Description.IPolicyExportExtension üzerinde System.ServiceModel.Channels.BindingElementuygulayın. Aşağıdaki kod örneği, bağlama düzeyinde bir özel ilke onaylama işleminin uygulanmasını gösterir.

    #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
    
  2. Bağlama öğesini program aracılığıyla veya bir uygulama yapılandırma dosyası kullanarak uç nokta bağlamasına ekleyin. Aşağıdaki yordamlara bakın.

Uygulama yapılandırma dosyası kullanarak bağlama öğesi eklemek için

  1. Özel ilke onaylama bağlama öğeniz için uygulayın System.ServiceModel.Configuration.BindingElementExtensionElement .

  2. bindingElementExtensions> öğesini kullanarak bağlama öğesi uzantısını <yapılandırma dosyasına ekleyin.

  3. kullanarak System.ServiceModel.Channels.CustomBindingözel bir bağlama oluşturun.

Bağlama öğesini program aracılığıyla eklemek için

  1. Yeni System.ServiceModel.Channels.BindingElement bir oluşturun ve öğesine System.ServiceModel.Channels.CustomBindingekleyin.

  2. 1. adımdaki özel bağlamayı ekleyin. yeni bir uç noktaya ekleyin ve yöntemini çağırarak bu yeni hizmet uç noktasını System.ServiceModel.ServiceHost öğesine AddServiceEndpoint ekleyin.

  3. ServiceHost dosyasını açın. Aşağıdaki kod örneği, özel bağlamanın oluşturulmasını ve bağlama öğelerinin program aracılığıyla eklenmesini gösterir.

    Uri baseAddress = new Uri("http://localhost:8000/servicemodelsamples/service");
    
    // Create a ServiceHost for the CalculatorService type and provide the base address.
    using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), baseAddress))
    {
        // Create a custom binding that contains two binding elements.
        ReliableSessionBindingElement reliableSession = new ReliableSessionBindingElement();
        reliableSession.Ordered = true;
    
        HttpTransportBindingElement httpTransport = new HttpTransportBindingElement();
        httpTransport.AuthenticationScheme = System.Net.AuthenticationSchemes.Anonymous;
        httpTransport.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;
    
        CustomBinding binding = new CustomBinding(reliableSession, httpTransport);
    
        // Add an endpoint using that binding.
        serviceHost.AddServiceEndpoint(typeof(ICalculator), binding, "");
    
        // Add a MEX endpoint.
        ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
        smb.HttpGetEnabled = true;
        smb.HttpGetUrl = new Uri("http://localhost:8001/servicemodelsamples");
        serviceHost.Description.Behaviors.Add(smb);
    
        // Open the ServiceHostBase to create listeners and start listening for messages.
        serviceHost.Open();
    
        // The service can now be accessed.
        Console.WriteLine("The service is ready.");
        Console.WriteLine("Press <ENTER> to terminate service.");
        Console.WriteLine();
        Console.ReadLine();
    
        // Close the ServiceHostBase to shutdown the service.
        serviceHost.Close();
    }
    
    Dim baseAddress As New Uri("http://localhost:8000/servicemodelsamples/service")
    
    ' Create a ServiceHost for the CalculatorService type and provide the base address.
    Using serviceHost As New ServiceHost(GetType(CalculatorService), baseAddress)
        ' Create a custom binding that contains two binding elements.
        Dim reliableSession As New ReliableSessionBindingElement()
        reliableSession.Ordered = True
    
        Dim httpTransport As New HttpTransportBindingElement()
        httpTransport.AuthenticationScheme = System.Net.AuthenticationSchemes.Anonymous
        httpTransport.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard
    
        Dim binding As New CustomBinding(reliableSession, httpTransport)
    
        ' Add an endpoint using that binding.
        serviceHost.AddServiceEndpoint(GetType(ICalculator), binding, "")
    
        ' Add a MEX endpoint.
        Dim smb As New ServiceMetadataBehavior()
        smb.HttpGetEnabled = True
        smb.HttpGetUrl = New Uri("http://localhost:8001/servicemodelsamples")
        serviceHost.Description.Behaviors.Add(smb)
    
        ' Open the ServiceHostBase to create listeners and start listening for messages.
        serviceHost.Open()
    
        ' The service can now be accessed.
        Console.WriteLine("The service is ready.")
        Console.WriteLine("Press <ENTER> to terminate service.")
        Console.WriteLine()
        Console.ReadLine()
    
        ' Close the ServiceHostBase to shutdown the service.
        serviceHost.Close()
    End Using
    

Ayrıca bkz.