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 müssen Sie verwenden die ServiceModel Metadata Utility Tool (Svcutil.exe) (oder ein vergleichbares Tool) eine dienstvertragsschnittstelle in einer verwalteten Sprache zu generieren, die Sie implementieren können, um die Anforderungen des Vertrags zu erfüllen. In der Regel die ServiceModel Metadata Utility Tool (Svcutil.exe) wird verwendet, um ein Dienstvertrag abgerufen, die mit einer Kanalfactory verwendet wird oder ein WCF Clienttyp sowie mit einer Konfigurationsdatei, die die korrekte Bindung und Adresse eingerichtet. 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:

  1. Verwenden der ServiceModel Metadata Utility Tool (Svcutil.exe) mit Metadatendateien oder einen Metadatenendpunkt zum Erzeugen einer Codedatei.

  2. Suchen Sie den Bereich der Ausgabe Codedatei mit der Oberfläche von Interesse sind (im Fall gibt es mehr als eine), die mit der System.ServiceModel.ServiceContractAttribute Attribut. Das folgende Codebeispiel zeigt die beiden Schnittstellen, die von generierten ServiceModel Metadata Utility Tool (Svcutil.exe). Die erste Schnittstelle (ISampleService) ist die Dienstvertragsschnittstelle, die zum Erstellen eines kompatiblen Diensts implementiert wird. Die zweite (ISampleServiceChannel) ist eine Hilfsschnittstelle für die Clientverwendung, die sowohl die dienstvertragsschnittstelle erweitert und System.ServiceModel.IClientChannel und ist für die Verwendung in einer Clientanwendung.

    [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. Wenn die WSDL keine Antwortaktion für alle Vorgänge angibt, die generierten Vorgangsverträge verfügen möglicherweise die ReplyAction -Eigenschaft 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.

  4. Implementieren Sie die Schnittstelle in einer Klasse, und hosten Sie den Dienst. Ein Beispiel finden Sie unter Gewusst wie: Implementieren eines Dienstvertrags, oder eine einfache Implementierung unten im Beispielabschnitt unter.

  5. In der Clientkonfiguration-Datei mit den ServiceModel Metadata Utility Tool (Svcutil.exe) generiert wird, ändern die <> > Konfigurationsabschnitt, der eine <> > Konfigurationsabschnitt. (Ein Beispiel für eine generierte Clientanwendungs-Konfigurationsdatei finden Sie im folgenden "Beispiel"-Abschnitt.)

  6. Innerhalb der <> > Konfiguration im Abschnitt, erstellen Sie eine name -Attribut in der <> > Konfigurationsabschnitt für die dienstimplementierung.

  7. Legen Sie das name-Dienstattribut auf den Konfigurationsnamen für die Dienstimplementierung fest.

  8. Fügen Sie die Endpunktkonfigurationselemente hinzu, die den implementierten Dienstvertrag für den Dienstkonfigurationsabschnitt verwenden.

Beispiel

Im folgenden Codebeispiel wird veranschaulicht, die Mehrheit der einer Codedatei durch Ausführen der ServiceModel Metadata Utility Tool (Svcutil.exe) für Metadaten-Dateien.

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 erweitert und System.ServiceModel.IClientChannel und ist für die Verwendung in einer Clientanwendung (ISampleServiceChannel).

  • Die Hilfsklasse, die erweitert System.ServiceModel.ClientBase<TChannel> und ist für die Verwendung in einer Clientanwendung (SampleServiceClient).

  • Die vom Dienst generierte Konfigurationsdatei.

  • Eine einfache ISampleService-Dienstimplementierung.

  • Eine Konvertierung der clientseitigen Konfigurationsdatei in eine dienstseitige 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);
    }
}
// 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;
  }
}

Siehe auch

ServiceModel Metadata Utility Tool (Svcutil.exe)