Vorgehensweise: Abrufen von Metadaten und Implementieren eines kompatiblen DienstsHow to: Retrieve Metadata and Implement a Compliant Service

Oftmals werden Dienste nicht von derselben Person entworfen und anschließend implementiert.Often, the same person does not design and implement services. 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.In environments where interoperating applications are important, contracts can be designed or described in Web Services Description Language (WSDL) and a developer must implement a service that complies with the provided contract. Möglicherweise möchten Sie auch einen vorhandenen Dienst an Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) migrieren, das Übertragungsformat jedoch beibehalten.You may also want to migrate an existing service to Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) but preserve the wire format. Außerdem werden Aufrufende von Duplexverträgen dazu aufgefordert, auch einen Rückrufvertrag zu implementieren.In addition, duplex contracts require callers to implement a callback contract as well.

In diesen Fällen verwenden Sie die ServiceModel Metadata Utility Tool (Svcutil.exe) (oder ein entsprechendes Tool) eine dienstvertragschnittstelle in einer verwalteten Sprache zu generieren, die Sie implementieren können, um die Anforderungen erfüllt die Vertrag.In these cases, you must use the ServiceModel Metadata Utility Tool (Svcutil.exe) (or an equivalent tool) to generate a service contract interface in a managed language that you can implement to fulfill the requirements of the contract. In der Regel die ServiceModel Metadata Utility Tool (Svcutil.exe) wird verwendet, um einen Dienstvertrag zu erwerben, die mit einer Kanalfactory verwendet wird oder ein WCFWCF Clienttyp sowie mit einer Client-Konfigurationsdatei, die richtet die korrekte Bindung und Adresse.Typically the ServiceModel Metadata Utility Tool (Svcutil.exe) is used to acquire a service contract that is used with a channel factory or a WCFWCF client type as well as with a client configuration file that sets up the correct binding and address. Um die generierte Konfigurationsdatei zu verwenden, müssen Sie diese in eine Dienstkonfigurationsdatei ändern.To use the generated configuration file, you must change it into a service configuration file. Sie müssen möglicherweise auch den Dienstvertrag ändern.You may also need to modify the service contract.

So rufen Sie Daten ab und implementieren einen kompatiblen Dienst:To retrieve data and implement a compliant service

  1. Verwenden der ServiceModel Metadata Utility Tool (Svcutil.exe) gegen Metadatendateien oder eine Metadatenendpunkt zum Erzeugen einer Codedatei.Use the ServiceModel Metadata Utility Tool (Svcutil.exe) against metadata files or a metadata endpoint to generate a code file.

  2. 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.Search for the portion of the output code file that contains the interface of interest (in case there is more than one) that is marked with the System.ServiceModel.ServiceContractAttribute attribute. Das folgende Codebeispiel zeigt die beiden Schnittstellen von generierten ServiceModel Metadata Utility Tool (Svcutil.exe).The following code example shows the two interfaces generated by ServiceModel Metadata Utility Tool (Svcutil.exe). Die erste Schnittstelle (ISampleService) ist die Dienstvertragsschnittstelle, die zum Erstellen eines kompatiblen Diensts implementiert wird.The first (ISampleService) is the service contract interface that you implement to create a compliant service. 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.The second (ISampleServiceChannel) is a helper interface for client use that extends both the service contract interface and System.ServiceModel.IClientChannel and is for use in a client application.

    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
    [System.ServiceModel.ServiceContractAttribute(
      Namespace="http://microsoft.wcf.documentation"
    )]
    public interface ISampleService
    {
        
        [System.ServiceModel.OperationContractAttribute(
          Action="http://microsoft.wcf.documentation/ISampleService/SampleMethod", 
          ReplyAction="http://microsoft.wcf.documentation/ISampleService/SampleMethodResponse"
        )]
        [System.ServiceModel.FaultContractAttribute(
          typeof(microsoft.wcf.documentation.SampleFault), 
          Action="http://microsoft.wcf.documentation/ISampleService/SampleMethodSampleFaultFault"
        )]
        string SampleMethod(string msg);
    }
    
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
    public interface ISampleServiceChannel : ISampleService, System.ServiceModel.IClientChannel
    {
    }
    
  3. 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.If the WSDL does not specify a reply action for all of the operations, the generated operation contracts may have the ReplyAction property set to the wildcard character (). Entfernen Sie diese Eigenschafteneinstellung.Remove this property setting. Andernfalls können die Metadaten bei der Implementierung der Dienstvertragsmetadaten nicht für diese Vorgänge exportiert werden.Otherwise, when you implement the service contract metadata, the metadata cannot be exported for those operations.

  4. Implementieren Sie die Schnittstelle in einer Klasse, und hosten Sie den Dienst.Implement the interface on a class and host the service. Ein Beispiel finden Sie unter Vorgehensweise: Implementieren eines Dienstvertrags, oder finden Sie eine einfache Implementierung unten im Beispielabschnitt.For an example, see How to: Implement a Service Contract, or see a simple implementation below in the Example section.

  5. In der Clientkonfiguration Datei, die mit der ServiceModel Metadata Utility Tool (Svcutil.exe) generiert, ändern Sie die <Client > Konfigurationsabschnitt, der eine <Services > Konfigurationsabschnitt.In the client configuration file that the ServiceModel Metadata Utility Tool (Svcutil.exe) generates, change the <client> configuration section to a <services> configuration section. (Ein Beispiel für eine generierte Clientanwendungs-Konfigurationsdatei finden Sie im folgenden "Beispiel"-Abschnitt.)(For an example of a generated client application configuration file, see the following "Example" section.)

  6. Innerhalb der <Services > Konfiguration im Abschnitt, erstellen Sie eine name Attribut in der <Services > Konfigurationsabschnitt für den Dienst -Implementierung.Within the <services> configuration section, create a name attribute in the <services> configuration section for your service implementation.

  7. Legen Sie das name-Dienstattribut auf den Konfigurationsnamen für die Dienstimplementierung fest.Set the service name attribute to the configuration name for your service implementation.

  8. Fügen Sie die Endpunktkonfigurationselemente hinzu, die den implementierten Dienstvertrag für den Dienstkonfigurationsabschnitt verwenden.Add the endpoint configuration elements that use the implemented service contract to the service configuration section.

BeispielExample

Das folgende Codebeispiel zeigt den Großteil einer Codedatei an, die durch die Ausführung generiert der ServiceModel Metadata Utility Tool (Svcutil.exe) gegen Metadatendateien.The following code example shows the majority of a code file generated by running the ServiceModel Metadata Utility Tool (Svcutil.exe) against metadata files.

Dies wird im folgenden Code veranschaulicht:The following code shows:

  • Die Dienstvertragsschnittstelle (ISampleService), die bei der Implementierung den Vertragsanforderungen entspricht.The service contract interface that, when implemented, complies with the contract requirements (ISampleService).

  • 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.The helper interface for client use that extends both the service contract interface and System.ServiceModel.IClientChannel and is for use in a client application (ISampleServiceChannel).

  • Die Hilfsklasse, die System.ServiceModel.ClientBase<TChannel> erweitert und für die Verwendung in einer Clientanwendung (SampleServiceClient) vorgesehen ist.The helper class that extends System.ServiceModel.ClientBase<TChannel> and is for use in a client application (SampleServiceClient).

  • Die vom Dienst generierte Konfigurationsdatei.The configuration file generated from the service.

  • Eine einfache ISampleService-Dienstimplementierung.A simple ISampleService service implementation.

  • Eine Konvertierung der clientseitigen Konfigurationsdatei in eine dienstseitige Version.A conversion of the client-side configuration file to a service-side version.

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:2.0.50727.42
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

[assembly: System.Runtime.Serialization.ContractNamespaceAttribute("http://microsoft.wcf.documentation", ClrNamespace="microsoft.wcf.documentation")]

namespace microsoft.wcf.documentation
{
    using System.Runtime.Serialization;
    
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
    [System.Runtime.Serialization.DataContractAttribute()]
    public partial class SampleFault : object, System.Runtime.Serialization.IExtensibleDataObject
    {
        
        private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
        
        private string FaultMessageField;
        
        public System.Runtime.Serialization.ExtensionDataObject ExtensionData
        {
            get
            {
                return this.extensionDataField;
            }
            set
            {
                this.extensionDataField = value;
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        public string FaultMessage
        {
            get
            {
                return this.FaultMessageField;
            }
            set
            {
                this.FaultMessageField = value;
            }
        }
    }
}

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(
  Namespace="http://microsoft.wcf.documentation"
)]
public interface ISampleService
{
    
    [System.ServiceModel.OperationContractAttribute(
      Action="http://microsoft.wcf.documentation/ISampleService/SampleMethod", 
      ReplyAction="http://microsoft.wcf.documentation/ISampleService/SampleMethodResponse"
    )]
    [System.ServiceModel.FaultContractAttribute(
      typeof(microsoft.wcf.documentation.SampleFault), 
      Action="http://microsoft.wcf.documentation/ISampleService/SampleMethodSampleFaultFault"
    )]
    string SampleMethod(string msg);
}

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface ISampleServiceChannel : ISampleService, System.ServiceModel.IClientChannel
{
}

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public partial class SampleServiceClient : System.ServiceModel.ClientBase<ISampleService>, ISampleService
{
    
    public SampleServiceClient()
    {
    }
    
    public SampleServiceClient(string endpointConfigurationName) : 
            base(endpointConfigurationName)
    {
    }
    
    public SampleServiceClient(string endpointConfigurationName, string remoteAddress) : 
            base(endpointConfigurationName, remoteAddress)
    {
    }
    
    public SampleServiceClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
            base(endpointConfigurationName, remoteAddress)
    {
    }
    
    public SampleServiceClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
            base(binding, remoteAddress)
    {
    }
    
    public string SampleMethod(string msg)
    {
        return base.Channel.SampleMethod(msg);
    }
}
<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="http://localhost:8080/SampleService" binding="basicHttpBinding"
                bindingConfiguration="BasicHttpBinding_ISampleService" contract="ISampleService"
                name="BasicHttpBinding_ISampleService" />
        </client>
    </system.serviceModel>
</configuration>
// Implement the service. This is a very simple service.
class SampleService : ISampleService
{
  public string SampleMethod(string msg)
  {
    Console.WriteLine("The caller said: \"{0}\"", msg);
    return "The service greets you: " + msg;
  }
}
<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="http://localhost:8080/SampleService" binding="basicHttpBinding"
            bindingConfiguration="BasicHttpBinding_ISampleService" contract="Microsoft.WCF.Documentation.ISampleService"
            />
      </service>
    </services>
  </system.serviceModel>
</configuration>

Siehe auchSee Also

ServiceModel Metadata Utility-Tool (Svcutil.exe)ServiceModel Metadata Utility Tool (Svcutil.exe)