Udostępnij za pośrednictwem


Konfiguracja i obsługa metadanych

W tym temacie opisano sposób włączania obsługi konfiguracji i metadanych dla powiązań i elementów powiązania.

Omówienie konfiguracji i metadanych

W tym temacie omówiono następujące zadania, które są opcjonalnymi elementami 1, 2 i 4 na liście zadań Tworzenie kanałów .

  • Włączanie obsługi pliku konfiguracji dla elementu powiązania.

  • Włączanie obsługi plików konfiguracji dla powiązania.

  • Eksportowanie asercji WSDL i zasad dla elementu powiązania.

  • Identyfikowanie asercji WSDL i zasad w celu wstawienia i skonfigurowania powiązania lub elementu powiązania.

Aby uzyskać informacje na temat tworzenia powiązań zdefiniowanych przez użytkownika i elementów powiązania, zobacz Tworzenie powiązań zdefiniowanych przez użytkownika i Tworzenie elementu BindingElement, odpowiednio.

Dodawanie obsługi konfiguracji

Aby włączyć obsługę plików konfiguracji dla kanału, należy zaimplementować dwie sekcje konfiguracji, System.ServiceModel.Configuration.BindingElementExtensionElementktóre umożliwiają obsługę konfiguracji dla elementów powiązań oraz System.ServiceModel.Configuration.StandardBindingElement i System.ServiceModel.Configuration.StandardBindingCollectionElement<TStandardBinding,TBindingConfiguration>, które umożliwiają obsługę konfiguracji powiązań.

Łatwiejszym sposobem wykonania tej czynności jest użycie przykładowego narzędzia ConfigurationCodeGenerator w celu wygenerowania kodu konfiguracji dla powiązań i elementów powiązania.

Rozszerzanie elementu BindingElementExtensionElement

Poniższy przykładowy kod jest pobierany z przykładu Transport: UDP . Jest UdpTransportElement to element BindingElementExtensionElement , który uwidacznia UdpTransportBindingElement system konfiguracji. W przypadku kilku podstawowych przesłonięć przykład definiuje nazwę sekcji konfiguracji, typ elementu powiązania i sposób tworzenia elementu powiązania. Użytkownicy mogą następnie zarejestrować sekcję rozszerzenia w pliku konfiguracji w następujący sposób.

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

Do rozszerzenia można odwoływać się z powiązań niestandardowych, aby używać protokołu UDP jako transportu.

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

Dodawanie konfiguracji dla powiązania

Sekcja SampleProfileUdpBindingCollectionElement jest elementem uwidacznianym StandardBindingCollectionElement<TStandardBinding,TBindingConfiguration>SampleProfileUdpBinding w systemie konfiguracji. Większość implementacji jest delegowana do SampleProfileUdpBindingConfigurationElementklasy , która pochodzi z klasy StandardBindingElement. Zawiera SampleProfileUdpBindingConfigurationElement właściwości, które odpowiadają właściwościom elementu SampleProfileUdpBindingi funkcji do mapowania z ConfigurationElement powiązania. OnApplyConfiguration Na koniec metoda jest zastępowana w SampleProfileUdpBindingpliku , jak pokazano w poniższym przykładowym kodzie.

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

Aby zarejestrować tę procedurę obsługi w systemie konfiguracji, dodaj następującą sekcję do odpowiedniego pliku konfiguracji.

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

Następnie można odwoływać się do niej z sekcji konfiguracji system.serviceModel>.<

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

Dodawanie obsługi metadanych dla elementu powiązania

Aby zintegrować kanał z systemem metadanych, musi obsługiwać zarówno importowanie, jak i eksportowanie zasad. Dzięki temu narzędzia, takie jak ServiceModel Metadata Utility Tool (Svcutil.exe), mogą generować klientów elementu powiązania.

Dodawanie obsługi języka WSDL

Element powiązania transportu w powiązaniu jest odpowiedzialny za eksportowanie i importowanie informacji dotyczących adresowania w metadanych. W przypadku korzystania z powiązania protokołu SOAP element powiązania transportu powinien również wyeksportować prawidłowy identyfikator URI transportu w metadanych. Poniższy przykładowy kod jest pobierany z przykładu Transport: UDP .

Eksportowanie WSDL

Aby wyeksportować informacje dotyczące adresowania, UdpTransportBindingElement implementuje System.ServiceModel.Description.IWsdlExportExtension interfejs. Metoda IWsdlExportExtension.ExportEndpoint dodaje poprawne informacje adresowania do portu WSDL.

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

Implementacja UdpTransportBindingElementExportEndpoint metody eksportuje również identyfikator URI transportu, gdy punkt końcowy używa powiązania protokołu SOAP:

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

Importowanie WSDL

Aby rozszerzyć system importu WSDL do obsługi importowania adresów, dodaj następującą konfigurację do pliku konfiguracji dla Svcutil.exe, jak pokazano w pliku Svcutil.exe.config:

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

W przypadku uruchamiania Svcutil.exe istnieją dwie opcje pobierania Svcutil.exe ładowania rozszerzeń importu WSDL:

  1. Wskaż Svcutil.exe do pliku konfiguracji przy użyciu pliku /SvcutilConfig:<file>.

  2. Dodaj sekcję konfiguracji do pliku Svcutil.exe.config w tym samym katalogu co Svcutil.exe.

Typ UdpBindingElementImporter implementuje System.ServiceModel.Description.IWsdlImportExtension interfejs. Metoda ImportEndpoint importuje adres z portu WSDL:

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

Dodawanie obsługi zasad

Niestandardowy element powiązania może eksportować asercji zasad w powiązaniu WSDL dla punktu końcowego usługi, aby wyrazić możliwości tego elementu powiązania. Poniższy przykładowy kod jest pobierany z przykładu Transport: UDP .

Eksportowanie zasad

Typ UdpTransportBindingElement implementuje System.ServiceModel.Description.IPolicyExportExtension obsługę eksportowania zasad. W związku z tym System.ServiceModel.Description.MetadataExporter uwzględnia UdpTransportBindingElement generowanie zasad dla wszystkich powiązań, które go zawierają.

W IPolicyExportExtension.ExportPolicysystemie dodaj asercji dla protokołu UDP i inną asercję, jeśli kanał jest w trybie multiemisji. Wynika to z faktu, że tryb multiemisji wpływa na sposób konstruowania stosu komunikacyjnego, a tym samym musi być skoordynowany między obie strony.

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));  
}  

Ponieważ niestandardowe elementy powiązania transportu są odpowiedzialne za obsługę adresowania, System.ServiceModel.Description.IPolicyExportExtension implementacja obiektu UdpTransportBindingElement musi również obsługiwać eksportowanie odpowiednich asercji zasad adresowania WS, aby wskazać wersję używanej wersji adresowania WS.

AddWSAddressingAssertion(context, encodingBindingElement.MessageVersion.Addressing);  

Importowanie zasad

Aby rozszerzyć system importowania zasad, dodaj następującą konfigurację do pliku konfiguracji dla Svcutil.exe, jak pokazano w pliku Svcutil.exe.config:

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

Następnie implementujemy System.ServiceModel.Description.IPolicyImportExtension z naszej zarejestrowanej klasy (UdpBindingElementImporter). W IPolicyImportExtension.ImportPolicypliku sprawdź asercji w odpowiedniej przestrzeni nazw i przetwarzaj te do generowania transportu i sprawdzania, czy jest multiemisji. Ponadto usuń potwierdzenia, które importer obsługuje z listy asercji powiązań. Ponownie podczas uruchamiania Svcutil.exe istnieją dwie opcje integracji:

  1. Wskaż Svcutil.exe do pliku konfiguracji przy użyciu pliku /SvcutilConfig:<file>.

  2. Dodaj sekcję konfiguracji do pliku Svcutil.exe.config w tym samym katalogu co Svcutil.exe.

Dodawanie niestandardowego importera powiązań standardowych

Svcutil.exe i System.ServiceModel.Description.WsdlImporter typ, domyślnie rozpoznaj i zaimportuj powiązania dostarczone przez system. W przeciwnym razie powiązanie zostanie zaimportowane jako System.ServiceModel.Channels.CustomBinding wystąpienie. Aby umożliwić Svcutil.exe i WsdlImporter import, SampleProfileUdpBindingUdpBindingElementImporter również działa jako niestandardowy importer powiązania standardowego.

Niestandardowy importer powiązania standardowego implementuje ImportEndpoint metodę w interfejsie System.ServiceModel.Description.IWsdlImportExtension , aby zbadać System.ServiceModel.Channels.CustomBinding wystąpienie zaimportowane z metadanych, aby sprawdzić, czy mogło zostać wygenerowane przez określone powiązanie standardowe.

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

Ogólnie rzecz biorąc, implementacja niestandardowego importera powiązania standardowego polega na sprawdzeniu właściwości importowanych elementów powiązania w celu sprawdzenia, czy tylko właściwości, które mogły zostać ustawione przez powiązanie standardowe, uległy zmianie, a wszystkie inne właściwości są ich wartościami domyślnymi. Podstawową strategią implementacji standardowego importera powiązania jest utworzenie wystąpienia powiązania standardowego, propagowanie właściwości z elementów powiązania standardowego do standardowego wystąpienia powiązania obsługiwanego przez powiązanie standardowe oraz porównanie elementów powiązania standardowego z importowanymi elementami powiązania.