Postupy: Načítání metadat a implementace kompatibilní služby

Stejná osoba často nenavrhuje a implementuje služby. Vprostředích aplikacích je možné navrhovat nebo popisovat v jazyce WSDL (Web Services Description Language) a vývojář musí implementovat službu, která je v souladu se zadaným kontraktem. Můžete také chtít migrovat existující službu do windows Communication Foundation (WCF), ale zachovat formát přenosu. Kromě toho duplexní kontrakty vyžadují volající, aby implementovali také kontrakt zpětného volání.

V těchto případech musíte použít nástroj ServiceModel Metadata Utility (Svcutil.exe) (nebo ekvivalentní nástroj) k vygenerování rozhraní kontraktů služeb ve spravovaném jazyce, který můžete implementovat, aby splňoval požadavky smlouvy. Nástroj ServiceModel Metadata Utility (Svcutil.exe) se obvykle používá k získání kontraktu služby, který se používá s objektem pro vytváření kanálů nebo s typem klienta WCF, stejně jako s konfiguračním souborem klienta, který nastavuje správnou vazbu a adresu. Pokud chcete použít vygenerovaný konfigurační soubor, musíte ho změnit na konfigurační soubor služby. Možná budete muset také upravit kontrakt služby.

Načtení dat a implementace kompatibilní služby

  1. K vygenerování souboru kódu použijte nástroj ServiceModel Metadata Utility (Svcutil.exe) u souborů metadat nebo koncového bodu metadat.

  2. Vyhledejte část výstupního souboru kódu, která obsahuje rozhraní zájmu (pokud existuje více než jeden), který je označen atributem System.ServiceModel.ServiceContractAttribute . Následující příklad kódu ukazuje dvě rozhraní vygenerovaná nástrojem ServiceModel Metadata Utility Tool (Svcutil.exe). První (ISampleService) je rozhraní kontraktu služeb, které implementujete pro vytvoření kompatibilní služby. Druhá (ISampleServiceChannel) je pomocné rozhraní pro použití klienta, které rozšiřuje rozhraní kontraktů služeb i System.ServiceModel.IClientChannel pro použití v klientské aplikaci.

    [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. Pokud WSDL nezadá akci odpovědi pro všechny operace, generované kontrakty operací mohou mít ReplyAction vlastnost nastavenou na zástupný znak (*). Odeberte toto nastavení vlastnosti. Jinak při implementaci metadat kontraktu služby nelze metadata pro tyto operace exportovat.

  4. Implementujte rozhraní ve třídě a hostujte službu. Příklad: Implementace kontraktu služby nebo jednoduchá implementace níže v části Příklad.

  5. V konfiguračním souboru klienta, který nástroj ServiceModel Metadata Utility (Svcutil.exe) generuje, změňte <oddíl konfigurace klienta> na< oddíl konfigurace služeb.> (Příklad vygenerovaného konfiguračního souboru klientské aplikace najdete v následující části Příklad.)

  6. V části konfigurace služeb> vytvořte name atribut v <části konfigurace služeb> pro implementaci služby.<

  7. Nastavte atribut služby name na název konfigurace pro implementaci služby.

  8. Přidejte do části konfigurace služby elementy konfigurace koncového bodu, které používají implementovaný kontrakt služby.

Příklad

Následující příklad kódu ukazuje většinu souboru kódu vygenerovaného spuštěním nástroje ServiceModel Metadata Utility Tool (Svcutil.exe) pro soubory metadat.

Následující kód ukazuje:

  • Rozhraní kontraktu služby, které při implementaci splňuje požadavky smlouvy (ISampleService).

  • Pomocné rozhraní pro použití klienta, které rozšiřuje rozhraní kontraktu služby a System.ServiceModel.IClientChannel používá se v klientské aplikaci (ISampleServiceChannel).

  • Pomocná třída, která rozšiřuje System.ServiceModel.ClientBase<TChannel> a je určena pro použití v klientské aplikaci (SampleServiceClient).

  • Konfigurační soubor vygenerovaný ze služby.

  • Jednoduchá ISampleService implementace služby.

  • Převod konfiguračního souboru na straně klienta na verzi na straně služby.

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

Viz také