Bagikan melalui


Memahami Kode Klien yang Dihasilkan

Alat Utilitas Metadata ServiceModel (Svcutil.exe) menghasilkan kode klien dan file konfigurasi aplikasi klien untuk digunakan dalam membangun aplikasi klien. Topik ini menyediakan tur contoh kode yang dihasilkan untuk skenario kontrak layanan standar. Untuk informasi selengkapnya tentang membangun aplikasi klien menggunakan kode yang dihasilkan, lihat Ringkasan Klien WCF.

Gambaran Umum

Jika Anda menggunakan Visual Studio untuk menghasilkan jenis klien Windows Communication Foundation (WCF) untuk proyek Anda, Anda biasanya tidak perlu memeriksa kode klien yang dihasilkan. Jika tidak menggunakan lingkungan pengembangan yang melakukan layanan yang sama untuk Anda, Anda dapat menggunakan alat seperti Svcutil.exe untuk menghasilkan kode klien dan kemudian menggunakan kode tersebut untuk mengembangkan aplikasi klien.

Karena Svcutil.exe memiliki sejumlah opsi yang memodifikasi informasi jenis yang dihasilkan, topik ini tidak membahas semua skenario. Namun, tugas standar berikut melibatkan penemuan kode yang dihasilkan:

  • Mengidentifikasi antarmuka kontrak layanan.

  • Mengidentifikasi kelas klien WCF.

  • Mengidentifikasi jenis data.

  • Mengidentifikasi kontrak panggilan balik untuk layanan dupleks.

  • Mengidentifikasi antarmuka saluran kontrak layanan pembantu.

Menemukan Antarmuka Kontrak Layanan

Untuk menemukan antarmuka yang memodelkan kontrak layanan, cari antarmuka yang ditandai dengan atribut System.ServiceModel.ServiceContractAttribute. Atribut ini sering kali sulit ditemukan dengan pembacaan cepat karena adanya atribut lain dan properti eksplisit yang ditetapkan pada atribut itu sendiri. Ingat bahwa antarmuka kontrak layanan dan antarmuka kontrak klien adalah dua jenis yang berbeda. Contoh kode berikut menunjukkan kelas kontrak layanan asli.

[ServiceContractAttribute(
  Namespace = "http://microsoft.wcf.documentation"
)]
public interface ISampleService
{
  [OperationContractAttribute]
  [FaultContractAttribute(typeof(microsoft.wcf.documentation.SampleFault))]
  string SampleMethod(string msg);
}

Contoh kode berikut menunjukkan kontrak layanan yang sama seperti yang dihasilkan oleh Svcutil.exe.

[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);
}

Anda dapat menggunakan antarmuka kontrak layanan yang dihasilkan bersama dengan kelas System.ServiceModel.ChannelFactory untuk membuat objek saluran WCF untuk memanggil operasi layanan. Untuk informasi selengkapnya, lihat Cara: Menggunakan ChannelFactory.

Menemukan Kelas Klien WCF

Untuk menemukan kelas klien WCF yang mengimplementasikan kontrak layanan yang ingin digunakan, cari ekstensi System.ServiceModel.ClientBase<TChannel>, di mana parameter jenis adalah antarmuka kontrak layanan yang sebelumnya Anda temukan dan yang memperluas antarmuka tersebut. Contoh kode berikut menunjukkan kelas ClientBase<TChannel> dari jenis ISampleService.

[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);
    }
}

Anda dapat menggunakan kelas klien WCF ini dengan membuat instans baru dan memanggil metode yang diterapkannya. Metode ini memanggil operasi layanan yang dirancang dan dikonfigurasi untuk berinteraksi dengannya. Untuk informasi selengkapnya, lihat Ringkasan Klien WCF.

Catatan

Saat SvcUtil.exe menghasilkan kelas klien WCF, DebuggerStepThroughAttribute akan ditambahkan ke kelas klien yang mencegah debugger melewati kelas klien WCF.

Menemukan Jenis Data

Untuk menemukan jenis data dalam kode yang dihasilkan, mekanisme paling dasar adalah mengidentifikasi nama jenis yang ditentukan dalam kontrak dan mencari kode untuk deklarasi jenis tersebut. Misalnya, kontrak berikut menentukan bahwa SampleMethod dapat menampilkan kesalahan SOAP jenis microsoft.wcf.documentation.SampleFault.

[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);

Mencari SampleFault akan menemukan deklarasi jenis berikut.

[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;
            }
        }
    }
}

Dalam hal ini, jenis datanya adalah jenis detail yang ditampilkan oleh pengecualian tertentu pada klien, FaultException<TDetail> di mana parameter jenis detailnya adalah microsoft.wcf.documentation.SampleFault. Untuk informasi selengkapnya tentang jenis data, lihat Menentukan Transfer Data dalam Kontrak Layanan. Untuk informasi selengkapnya tentang menangani pengecualian di klien, lihat Kesalahan Pengiriman dan Penerimaan.

Menemukan Kontrak Panggilan Balik untuk Layanan Duplex

Jika Anda menemukan kontrak layanan yang antarmuka kontraknya menentukan nilai untuk properti ServiceContractAttribute.CallbackContract, maka kontrak tersebut akan menentukan kontrak dupleks. Kontrak dupleks mengharuskan aplikasi klien membuat kelas panggilan balik yang mengimplementasikan kontrak panggilan balik dan meneruskan instans kelas tersebut ke System.ServiceModel.DuplexClientBase<TChannel> atau System.ServiceModel.DuplexChannelFactory<TChannel> yang digunakan untuk berkomunikasi dengan layanan. Untuk informasi selengkapnya tentang klien dupleks, lihat Cara: Mengakses Layanan dengan Kontrak Dupleks.

Kontrak berikut menentukan kontrak panggilan balik jenis SampleDuplexHelloCallback.

[System.ServiceModel.ServiceContractAttribute(
  Namespace="http://microsoft.wcf.documentation",
  ConfigurationName="SampleDuplexHello",
  CallbackContract=typeof(SampleDuplexHelloCallback),
  SessionMode=System.ServiceModel.SessionMode.Required
)]
public interface SampleDuplexHello
{
  [System.ServiceModel.OperationContractAttribute(
      IsOneWay=true,
      Action="http://microsoft.wcf.documentation/SampleDuplexHello/Hello"
    )]
    void Hello(string greeting);
  }
    <System.ServiceModel.OperationContractAttribute(IsOneWay:=True, _
        Action:="http://microsoft.wcf.documentation/SampleDuplexHello/Hello")> _
    Sub Hello(ByVal greeting As String)
End Interface 'SampleDuplexHello

Mencari kontrak panggilan balik tersebut akan menemukan antarmuka berikut yang harus diterapkan oleh aplikasi klien.

  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface SampleDuplexHelloCallback
{
  [System.ServiceModel.OperationContractAttribute(
      IsOneWay=true,
      Action="http://microsoft.wcf.documentation/SampleDuplexHello/Reply"
    )]
    void Reply(string responseToGreeting);
  }
<System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")>  _
Public Interface SampleDuplexHelloCallback
    <System.ServiceModel.OperationContractAttribute( _
        IsOneWay:=True, _
        Action:="http://microsoft.wcf.documentation/SampleDuplexHello/Reply")> _
    Sub Reply(ByVal responseToGreeting As String)
End Interface 'SampleDuplexHelloCallback

Menemukan Antarmuka Saluran Kontrak Layanan

Saat menggunakan kelas ChannelFactory dengan antarmuka kontrak layanan, Anda harus mentransmisikan ke antarmuka System.ServiceModel.IClientChannel untuk membuka, menutup, atau membatalkan saluran secara eksplisit. Untuk memudahkan penggunaannya, alat Svcutil.exe juga menghasilkan antarmuka pembantu yang mengimplementasikan antarmuka kontrak layanan dan IClientChannel untuk memungkinkan Anda berinteraksi dengan infrastruktur saluran klien tanpa harus mentransmisikan. Kode berikut menunjukkan definisi saluran klien pembantu yang mengimplementasikan kontrak layanan sebelumnya.

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

Lihat juga