Cara: Mengambil Metadata dan Mengimplementasikan Layanan yang Sesuai

Biasanya, orang yang sama tidak merancang dan mengimplementasikan layanan. Di lingkungan yang menganggap penting aplikasi yang disinergikan, kontrak dapat dirancang atau dijelaskan dalam Bahasa Deskripsi Layanan Web (WSDL) dan pengembang harus mengimplementasikan layanan yang sesuai dengan kontrak yang disediakan. Anda mungkin juga ingin memigrasikan layanan yang ada ke Windows Communication Foundation (WCF) tetapi mempertahankan format kabel. Selain itu, kontrak dupleks mewajibkan pemanggil untuk mengimplementasikan kontrak panggilan balik juga.

Dalam kasus ini, Anda harus menggunakan Alat Utilitas Metadata ServiceModel (Svcutil.exe) (atau alat yang setara) untuk menghasilkan antarmuka kontrak layanan dalam bahasa terkelola yang dapat Anda implementasikan untuk memenuhi persyaratan kontrak. Biasanya Alat Utilitas Metadata ServiceModel (Svcutil.exe) digunakan untuk memperoleh kontrak layanan yang digunakan dengan pabrik saluran atau jenis klien WCF serta dengan file konfigurasi klien yang menyiapkan pengikatan dan alamat yang benar. Untuk menggunakan file konfigurasi yang dihasilkan, Anda harus mengubahnya menjadi file konfigurasi layanan. Anda mungkin juga perlu mengubah kontrak layanan.

Untuk mengambil data dan mengimplementasikan layanan yang sesuai

  1. Gunakan Alat Utilitas Metadata ServiceModel (Svcutil.exe) terhadap file metadata atau titik akhir metadata untuk menghasilkan file kode.

  2. Cari bagian file kode output yang berisi antarmuka yang menarik (jika ada lebih dari satu) yang ditandai dengan atribut System.ServiceModel.ServiceContractAttribute. Contoh kode berikut menunjukkan dua antarmuka yang dihasilkan oleh Alat Utilitas Metadata ServiceModel (Svcutil.exe). Yang pertama (ISampleService) adalah antarmuka kontrak layanan yang Anda implementasikan untuk membuat layanan yang sesuai. Yang kedua (ISampleServiceChannel) adalah antarmuka pembantu untuk penggunaan klien yang memperluas antarmuka kontrak layanan dan System.ServiceModel.IClientChannel untuk digunakan dalam aplikasi klien.

    [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. Jika Bahasa Deskripsi Layanan Web tidak menentukan tindakan balas untuk semua operasi, kontrak operasi yang dihasilkan mungkin memiliki properti ReplyAction yang diatur ke wildcard (*). Hapus pengaturan properti ini. Jika tidak, saat Anda mengimplementasikan metadata kontrak layanan, metadata tidak dapat diekspor untuk operasi tersebut.

  4. Implementasikan antarmuka pada kelas dan hosting layanan. Misalnya, lihat Cara: Mengimplementasikan Kontrak Layanan, atau lihat implementasi sederhana di bawah ini di bagian Contoh.

  5. Dalam file konfigurasi klien yang dihasilkan Alat Utilitas Metadata ServiceModel (Svcutil.exe), ubah bagian konfigurasi <client> ke bagian konfigurasi <service>. (Untuk contoh file konfigurasi aplikasi klien yang dihasilkan, lihat bagian "Contoh" berikut.)

  6. Dalam bagian konfigurasi <services>, buat atribut name di bagian konfigurasi <services> untuk implementasi layanan Anda.

  7. Atur atribut name layanan ke nama konfigurasi untuk implementasi layanan Anda.

  8. Tambahkan elemen konfigurasi titik akhir yang menggunakan kontrak layanan yang diimplementasikan ke bagian konfigurasi layanan.

Contoh

Contoh kode berikut menunjukkan sebagian besar file kode yang dihasilkan dengan menjalankan Alat Utilitas Metadata ServiceModel (Svcutil.exe) terhadap file metadata.

Kode berikut menunjukkan:

  • Antarmuka kontrak layanan yang, saat diimplementasikan, mematuhi persyaratan kontrak (ISampleService).

  • Antarmuka pembantu untuk penggunaan klien yang memperluas antarmuka kontrak layanan dan System.ServiceModel.IClientChannel, serta digunakan dalam aplikasi klien (ISampleServiceChannel).

  • Kelas pembantu yang memperluas System.ServiceModel.ClientBase<TChannel> dan digunakan dalam aplikasi klien (SampleServiceClient).

  • File konfigurasi yang dihasilkan dari layanan.

  • Implementasi layanan ISampleService simpel.

  • Konversi file konfigurasi sisi klien ke versi sisi layanan.

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

Lihat juga