Vorgehensweise: Abrufen von Metadaten und Implementieren eines kompatiblen Diensts
Oftmals werden Dienste nicht von derselben Person entworfen und anschließend implementiert. In Umgebungen, in denen zusammenwirkende Anwendungen wichtig sind, können Verträge in Web Services Description Language (WSDL) entworfen oder beschrieben werden, und ein Entwickler muss einen Dienst implementieren, der mit dem bereitgestellten Vertrag kompatibel ist. Möglicherweise möchten Sie auch einen vorhandenen Dienst an Windows Communication Foundation (WCF) migrieren, das Übertragungsformat jedoch beibehalten. Außerdem werden Aufrufende von Duplexverträgen dazu aufgefordert, auch einen Rückrufvertrag zu implementieren.
In diesen Fällen ist das ServiceModel Metadata Utility-Tool (Svcutil.exe) (oder ein vergleichbares Tool) zu verwenden, um eine Dienstvertragsschnittstelle in einer verwalteten Sprache zu generieren, die Sie zum Erfüllen der Vertragsanforderungen implementieren können. Normalerweise wird mit dem ServiceModel Metadata Utility-Tool (Svcutil.exe) ein Dienstvertrag abgerufen, der mit einer Kanalfactory oder einem WCF-Clienttypen sowie mit einer Clientkonfigurationsdatei verwendet wird, mit der die korrekte Bindung und Adresse eingerichtet werden. Um die generierte Konfigurationsdatei zu verwenden, müssen Sie diese in eine Dienstkonfigurationsdatei ändern. Sie müssen möglicherweise auch den Dienstvertrag ändern.
So rufen Sie Daten ab und implementieren einen kompatiblen Dienst:
Verwenden Sie das ServiceModel Metadata Utility-Tool (Svcutil.exe) mit Metadatendateien oder einen Metadatenendpunkt, um eine Codedatei zu generieren.
Suchen Sie den Bereich der Ausgabecodedatei mit der wichtigen Schnittstelle (falls mehr als eine vorhanden ist), die mit dem System.ServiceModel.ServiceContractAttribute-Attribut gekennzeichnet ist. Im folgenden Codebeispiel werden die zwei mit dem ServiceModel Metadata Utility-Tool (Svcutil.exe) generierten Schnittstellen gezeigt. Die erste Schnittstelle (
ISampleService
) ist die Dienstvertragsschnittstelle, die zum Erstellen eines kompatiblen Diensts implementiert wird. Bei der zweiten Schnittstelle (ISampleServiceChannel
) handelt es sich um eine Hilfsschnittstelle für die Clientverwendung, die sowohl die Dienstvertragsschnittstelle als auch System.ServiceModel.IClientChannel erweitert und für die Verwendung in einer Clientanwendung vorgesehen ist.Wird mit WSDL keine Antwortaktion für alle Vorgänge angegeben, ist bei den generierten Vorgangsverträgen die ReplyAction-Eigenschaft möglicherweise auf das Platzhalterzeichen (*) festgelegt. Entfernen Sie diese Eigenschafteneinstellung. Andernfalls können die Metadaten bei der Implementierung der Dienstvertragsmetadaten nicht für diese Vorgänge exportiert werden.
Implementieren Sie die Schnittstelle in einer Klasse, und hosten Sie den Dienst. Ein Beispiel finden Sie unter Gewusst wie: Implementieren eines Windows Communication Foundation-Dienstvertrags. Im Beispielabschnitt unten finden Sie ebenfalls eine einfache Implementierung.
Ändern Sie in der mit dem ServiceModel Metadata Utility-Tool (Svcutil.exe) generierten Clientkonfigurationsdatei den Konfigurationsabschnitt <client><services> in einen Konfigurationsabschnitt vom Typ. (Ein Beispiel für eine generierte Clientanwendungs-Konfigurationsdatei finden Sie im folgenden "Beispiel"-Abschnitt.)
Erstellen Sie innerhalb des Konfigurationsabschnitts <services>name ein <services>-Attribut im Konfigurationsabschnitt für die Dienstimplementierung.
Legen Sie das name-Dienstattribut auf den Konfigurationsnamen für die Dienstimplementierung fest.
Fügen Sie die Endpunktkonfigurationselemente hinzu, die den implementierten Dienstvertrag für den Dienstkonfigurationsabschnitt verwenden.
Beispiel
Im folgenden Codebeispiel wird das Generieren des Großteils einer Codedatei durch Ausführen des ServiceModel Metadata Utility-Tool (Svcutil.exe) auf Grundlage der Metadatendateien gezeigt.
Dies wird im folgenden Code veranschaulicht:
Die Dienstvertragsschnittstelle (
ISampleService
), die bei der Implementierung den Vertragsanforderungen entspricht.Die Hilfsschnittstelle für die Clientverwendung, die sowohl die Dienstvertragsschnittstelle als auch System.ServiceModel.IClientChannel erweitert und für die Verwendung in einer Clientanwendung (
ISampleServiceChannel
) vorgesehen ist.Die Hilfsklasse, die System.ServiceModel.ClientBase erweitert und für die Verwendung in einer Clientanwendung (
SampleServiceClient
) vorgesehen ist.Die vom Dienst generierte Konfigurationsdatei.
Eine einfache
ISampleService
-Dienstimplementierung.Eine Konvertierung der clientseitigen Konfigurationsdatei in eine dienstseitige Version.
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_ISampleService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="https://localhost:8080/SampleService" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_ISampleService" contract="ISampleService"
name="BasicHttpBinding_ISampleService" />
</client>
</system.serviceModel>
</configuration>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_ISampleService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<services>
<service
name="Microsoft.WCF.Documentation.SampleService">
<endpoint address="https://localhost:8080/SampleService" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_ISampleService" contract="Microsoft.WCF.Documentation.ISampleService"
/>
</service>
</services>
</system.serviceModel>
</configuration>