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 SampleProfileUdpBindingConfigurationElement
klasy , która pochodzi z klasy StandardBindingElement. Zawiera SampleProfileUdpBindingConfigurationElement
właściwości, które odpowiadają właściwościom elementu SampleProfileUdpBinding
i funkcji do mapowania z ConfigurationElement
powiązania. OnApplyConfiguration
Na koniec metoda jest zastępowana w SampleProfileUdpBinding
pliku , 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 UdpTransportBindingElement
ExportEndpoint 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:
Wskaż Svcutil.exe do pliku konfiguracji przy użyciu pliku /SvcutilConfig:<file>.
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:
Wskaż Svcutil.exe do pliku konfiguracji przy użyciu pliku /SvcutilConfig:<file>.
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, SampleProfileUdpBinding
UdpBindingElementImporter
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.