Aracılığıyla paylaş


Yapılandırma ve Meta Veri Desteği

Bu konuda bağlamalar ve bağlama öğeleri için yapılandırma ve meta veri desteğinin nasıl etkinleştirileceği açıklanır.

Yapılandırmaya ve Meta Veriye Genel Bakış

Bu konu başlığında, Kanal Geliştirme görev listesindeki isteğe bağlı 1, 2 ve 4 öğeleri olan aşağıdaki görevler açıklanmaktadır .

  • Bağlama öğesi için yapılandırma dosyası desteğini etkinleştirme.

  • Bağlama için yapılandırma dosyası desteğini etkinleştirme.

  • Bağlama öğesi için WSDL ve ilke onayları dışarı aktarıyor.

  • Bağlama veya bağlama öğenizi eklemek ve yapılandırmak için WSDL ve ilke onaylarını tanımlama.

Kullanıcı tanımlı bağlamalar ve bağlama öğeleri oluşturma hakkında bilgi için bkz . Sırasıyla Kullanıcı Tanımlı Bağlamalar Oluşturma ve BindingElement Oluşturma.

Yapılandırma Desteği Ekleme

Bir kanal için yapılandırma dosyası desteğini etkinleştirmek için, bağlama öğeleri System.ServiceModel.Configuration.StandardBindingElement için yapılandırma desteğine olanak tanıyan ve bağlamalar System.ServiceModel.Configuration.BindingElementExtensionElementiçin yapılandırma desteğini etkinleştiren ve System.ServiceModel.Configuration.StandardBindingCollectionElement<TStandardBinding,TBindingConfiguration>olmak üzere iki yapılandırma bölümü uygulamanız gerekir.

Bunu gerçekleştirmenin daha kolay bir yolu, bağlamalarınız ve bağlama öğeleriniz için yapılandırma kodu oluşturmak üzere ConfigurationCodeGenerator örnek aracını kullanmaktır.

BindingElementExtensionElement Genişletiyor

Aşağıdaki örnek kod Aktarım: UDP örneğinden alınmıştır. UdpTransportElement, yapılandırma sistemini kullanıma sunan UdpTransportBindingElement bir BindingElementExtensionElement sistemdir. Birkaç temel geçersiz kılma ile örnek yapılandırma bölümü adını, bağlama öğesinin türünü ve bağlama öğesinin nasıl oluşturulacağını tanımlar. Kullanıcılar daha sonra uzantı bölümünü aşağıdaki gibi bir yapılandırma dosyasına kaydedebilir.

<configuration>  
  <system.serviceModel>  
    <extensions>  
      <bindingElementExtensions>  
      <add name="udpTransport" type="Microsoft.ServiceModel.Samples.UdpTransportElement, UdpTransport" />  
      </bindingElementExtensions>  
    </extensions>  
  </system.serviceModel>  
</configuration>  

Uzantıya, aktarım olarak UDP kullanmak için özel bağlamalardan başvurulabilir.

<configuration>  
  <system.serviceModel>  
    <bindings>  
      <customBinding>  
       <binding configurationName="UdpCustomBinding">  
         <udpTransport/>  
       </binding>  
      </customBinding>  
    </bindings>  
  </system.serviceModel>  
</configuration>  

Bağlama için Yapılandırma Ekleme

bölümü, yapılandırma sistemini kullanıma sunan SampleProfileUdpBinding bir StandardBindingCollectionElement<TStandardBinding,TBindingConfiguration> bölümdürSampleProfileUdpBindingCollectionElement. Uygulamanın büyük bir kısmı, 'den StandardBindingElementtüretilen öğesine temsilci olarak atandıSampleProfileUdpBindingConfigurationElement. , SampleProfileUdpBindingConfigurationElement üzerindeki SampleProfileUdpBindingözelliklere karşılık gelen özelliklere ve bağlamadan eşlemek için işlevlere ConfigurationElement sahiptir. Son olarak, OnApplyConfiguration aşağıdaki örnek kodda SampleProfileUdpBindinggösterildiği gibi yöntemi içinde geçersiz kılınmış olur.

protected override void OnApplyConfiguration(string configurationName)  
{  
            if (binding == null)  
                throw new ArgumentNullException("binding");  
  
            if (binding.GetType() != typeof(SampleProfileUdpBinding))  
            {  
                var expectedType = typeof(SampleProfileUdpBinding).AssemblyQualifiedName;
                var typePassedIn = binding.GetType().AssemblyQualifiedName;
                throw new ArgumentException($"Invalid type for binding. Expected type: {expectedType}. Type passed in: {typePassedIn}.");  
            }  
            SampleProfileUdpBinding udpBinding = (SampleProfileUdpBinding)binding;  
  
            udpBinding.OrderedSession = this.OrderedSession;  
            udpBinding.ReliableSessionEnabled = this.ReliableSessionEnabled;  
            udpBinding.SessionInactivityTimeout = this.SessionInactivityTimeout;  
            if (this.ClientBaseAddress != null)  
                   udpBinding.ClientBaseAddress = ClientBaseAddress;  
}  

Bu işleyiciyi yapılandırma sistemine kaydetmek için aşağıdaki bölümü ilgili yapılandırma dosyasına ekleyin.

<configuration>  
  <configSections>  
     <sectionGroup name="system.serviceModel">  
         <sectionGroup name="bindings">  
                 <section name="sampleProfileUdpBinding" type="Microsoft.ServiceModel.Samples.SampleProfileUdpBindingCollectionElement, UdpTransport" />  
         </sectionGroup>  
     </sectionGroup>  
  </configSections>  
</configuration>  

Ardından system.serviceModel> yapılandırma bölümünden <başvurulabilir.

<configuration>  
  <system.serviceModel>  
    <client>  
      <endpoint configurationName="calculator"  
                address="soap.udp://localhost:8001/"
                bindingConfiguration="CalculatorServer"  
                binding="sampleProfileUdpBinding"
                contract= "Microsoft.ServiceModel.Samples.ICalculatorContract">  
      </endpoint>  
    </client>  
  </system.serviceModel>  
</configuration>  

Bağlama Öğesi için Meta Veri Desteği Ekleme

Bir kanalı meta veri sistemiyle tümleştirmek için ilkenin hem içeri hem de dışarı aktarılmasını desteklemesi gerekir. Bu, ServiceModel Meta Veri Yardımcı Programı Aracı (Svcutil.exe) gibi araçların bağlama öğesinin istemcilerini oluşturmasına olanak tanır.

WSDL Desteği Ekleme

Bağlamadaki aktarım bağlama öğesi, meta verilerdeki adresleme bilgilerini dışarı ve içeri aktarmakla sorumludur. SOAP bağlaması kullanılırken, aktarım bağlama öğesi de meta verilerde doğru bir aktarım URI'sini dışarı aktarmalıdır. Aşağıdaki örnek kod Aktarım: UDP örneğinden alınmıştır.

WSDL Dışarı Aktarma

Adresleme bilgilerini UdpTransportBindingElement dışarı aktarmak için arabirimini System.ServiceModel.Description.IWsdlExportExtension uygular. yöntemi WSDL IWsdlExportExtension.ExportEndpoint bağlantı noktasına doğru adresleme bilgilerini ekler.

if (context.WsdlPort != null)  
{  
    AddAddressToWsdlPort(context.WsdlPort, context.Endpoint.Address, encodingBindingElement.MessageVersion.Addressing);  
}  

UdpTransportBindingElement Yöntemin ExportEndpoint uygulanması, uç nokta BIR SOAP bağlaması kullandığında bir aktarım URI'sini de dışarı aktarır:

WsdlNS.SoapBinding soapBinding = GetSoapBinding(context, exporter);  
if (soapBinding != null)  
{  
    soapBinding.Transport = UdpPolicyStrings.UdpNamespace;  
}  

WSDL İçeri Aktarma

WSDL içeri aktarma sistemini adresleri içeri aktarmayı işleyecek şekilde genişletmek için, Svcutil.exe.config dosyasında gösterildiği gibi Svcutil.exe yapılandırma dosyasına aşağıdaki yapılandırmayı ekleyin:

<configuration>  
  <system.serviceModel>  
    <client>  
      <metadata>  
        <wsdlImporters>  
          <extension type=" Microsoft.ServiceModel.Samples.UdpBindingElementImporter, UdpTransport" />  
        </wsdlImporters>  
      </metadata>  
    </client>  
  </system.serviceModel>  
</configuration>  

Svcutil.exe çalıştırırken WSDL içeri aktarma uzantılarını yüklemek için Svcutil.exe almak için iki seçenek vardır:

  1. /SvcutilConfig:<file dosyasını kullanarak Svcutil.exe yapılandırma dosyasının> üzerine gelin.

  2. yapılandırma bölümünü Svcutil.exe ile aynı dizindeki Svcutil.exe.config'e ekleyin.

türü UdpBindingElementImporter arabirimini System.ServiceModel.Description.IWsdlImportExtension uygular. yöntemi WSDL ImportEndpoint bağlantı noktasından adresi içeri aktarır:

BindingElementCollection bindingElements = context.Endpoint.Binding.CreateBindingElements();  
TransportBindingElement transportBindingElement = bindingElements.Find<TransportBindingElement>();  
if (transportBindingElement is UdpTransportBindingElement)  
{  
    ImportAddress(context);  
}  

İlke Desteği Ekleme

Özel bağlama öğesi, bir hizmet uç noktası için WSDL bağlamasında ilke onaylarını dışarı aktararak bu bağlama öğesinin özelliklerini ifade edebilir. Aşağıdaki örnek kod Aktarım: UDP örneğinden alınmıştır.

İlke Dışarı Aktarma

türü, UdpTransportBindingElement ilke dışarı aktarma desteği eklemek için uygulanır System.ServiceModel.Description.IPolicyExportExtension . Sonuç olarak, System.ServiceModel.Description.MetadataExporter ilkeyi içeren UdpTransportBindingElement tüm bağlamalar için ilkenin oluşturulmasını içerir.

içinde IPolicyExportExtension.ExportPolicy, kanal çok noktaya yayın modundaysa UDP için bir onay ve başka bir onay ekleyin. Bunun nedeni, çok noktaya yayın modunun iletişim yığınının nasıl oluşturulacağı ve bu nedenle her iki taraf arasında eşgüdümlü olması gerektiğidir.

ICollection<XmlElement> bindingAssertions = context.GetBindingAssertions();  
XmlDocument xmlDocument = new XmlDocument();  
bindingAssertions.Add(xmlDocument.CreateElement(  
UdpPolicyStrings.Prefix, UdpPolicyStrings.TransportAssertion, UdpPolicyStrings.UdpNamespace));  
if (Multicast)  
{  
    bindingAssertions.Add(xmlDocument.CreateElement(  
UdpPolicyStrings.Prefix, UdpPolicyStrings.MulticastAssertion,     UdpPolicyStrings.UdpNamespace));  
}  

Özel aktarım bağlama öğeleri adreslemeden sorumlu olduğundan, System.ServiceModel.Description.IPolicyExportExtension üzerindeki UdpTransportBindingElement uygulama, kullanılmakta olan WS-Addressing sürümünü belirtmek için uygun WS-Adresleme ilkesi onaylarını dışarı aktarmayı da işlemelidir.

AddWSAddressingAssertion(context, encodingBindingElement.MessageVersion.Addressing);  

İlke İçeri Aktarma

İlke içeri aktarma sistemini genişletmek için, Svcutil.exe.config dosyasında gösterildiği gibi Svcutil.exe yapılandırma dosyasına aşağıdaki yapılandırmayı ekleyin:

<configuration>  
  <system.serviceModel>  
    <client>  
      <metadata>  
        <policyImporters>  
          <extension type=" Microsoft.ServiceModel.Samples.UdpBindingElementImporter, UdpTransport" />  
        </policyImporters>  
      </metadata>  
    </client>  
  </system.serviceModel>  
</configuration>  

Ardından kayıtlı sınıfımızdan (UdpBindingElementImporter) uygularızSystem.ServiceModel.Description.IPolicyImportExtension. içinde IPolicyImportExtension.ImportPolicy, uygun ad alanında onayları inceleyin ve aktarım oluşturmak ve çok noktaya yayın olup olmadığını denetlemek için olanları işleyin. Ayrıca, içeri aktarıcının işlediği onayları bağlama onayları listesinden kaldırın. Svcutil.exe çalıştırırken iki tümleştirme seçeneği vardır:

  1. /SvcutilConfig:<file> dosyasını kullanarak yapılandırma dosyamıza Svcutil.exe işaret edin.

  2. yapılandırma bölümünü Svcutil.exe ile aynı dizindeki Svcutil.exe.config'e ekleyin.

Özel Standart Bağlama İçeri Aktarıcı ekleme

Svcutil.exe ve System.ServiceModel.Description.WsdlImporter türü varsayılan olarak sistem tarafından sağlanan bağlamaları tanır ve içeri aktarır. Aksi takdirde bağlama örnek System.ServiceModel.Channels.CustomBinding olarak içeri aktarılır. Svcutil.exe etkinleştirmek ve WsdlImporter içeri aktarmak SampleProfileUdpBindingUdpBindingElementImporter için de özel bir standart bağlama içeri aktarıcı işlevi görür.

Özel standart bağlama içeri aktarıcısı, meta verilerden içeri aktarılan örneği inceleyerek System.ServiceModel.Channels.CustomBinding belirli bir standart bağlama tarafından oluşturulup oluşturulmadığını görmek için arabiriminde yöntemini System.ServiceModel.Description.IWsdlImportExtension uygularImportEndpoint.

if (context.Endpoint.Binding is CustomBinding)  
{  
    Binding binding;  
    if (transportBindingElement is UdpTransportBindingElement)  
    {  
        //if TryCreate is true, the CustomBinding will be replace by a SampleProfileUdpBinding in the  
        //generated config file for better typed generation.  
        if (SampleProfileUdpBinding.TryCreate(bindingElements, out binding))  
        {  
            binding.Name = context.Endpoint.Binding.Name;  
            binding.Namespace = context.Endpoint.Binding.Namespace;  
            context.Endpoint.Binding = binding;  
        }  
    }  
}  

Genel olarak, özel bir standart bağlama içeri aktarıcısı uygulamak, yalnızca standart bağlama tarafından ayarlanmış olabilecek özelliklerin değiştiğini ve diğer tüm özelliklerin varsayılanları olduğunu doğrulamak için içeri aktarılan bağlama öğelerinin özelliklerini denetlemeyi içerir. Standart bağlama içeri aktarıcısı uygulamak için temel bir strateji, standart bağlamanın bir örneğini oluşturmak, bağlama öğelerinden standart bağlamanın desteklediği standart bağlama örneğine özellikleri yaymak ve standart bağlamadaki bağlama öğelerini içeri aktarılan bağlama öğeleriyle karşılaştırmaktır.