Bagikan melalui


Kontrak Pesan Default

Sampel Kontrak Pesan Default menunjukkan layanan tempat pesan buatan pengguna khusus diteruskan ke dan dari operasi layanan. Sampel ini didasarkan pada Memulai yang mengimplementasikan antarmuka kalkulator sebagai layanan yang diketik. Alih-alih operasi layanan individual untuk penambahan, pengurangan, perkalian, dan pembagian yang digunakan dalam Memulai, sampel ini meneruskan pesan khusus yang berisi operand dan operator, dan mengembalikan hasil perhitungan aritmatika.

Klien adalah program konsol (.exe) dan pustaka layanan (.dll) dihosting oleh Layanan Informasi Internet (IIS). Aktivitas klien terlihat di jendela konsol.

Catatan

Prosedur penyiapan dan petunjuk pembuatan untuk sampel ini terdapat di akhir topik ini.

Dalam layanan, satu operasi layanan didefinisikan yang menerima dan mengembalikan pesan kustom jenis MyMessage. Meskipun dalam sampel ini pesan permintaan dan respons memiliki jenis yang sama, pesan tersebut tentu saja bisa menjadi kontrak pesan yang berbeda jika perlu.

[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
    [OperationContract(Action="http://test/MyMessage_action",
                  ReplyAction="http://test/MyMessage_action")]
    MyMessage Calculate(MyMessage request);
}

Pesan kustom MyMessage didefinisikan dalam kelas yang dianotasikan dengan atribut MessageContractAttribute, MessageHeaderAttribute dan MessageBodyMemberAttribute. Hanya konstruktor ketiga yang digunakan dalam sampel ini. Menggunakan kontrak pesan memungkinkan Anda untuk menjalankan kontrol penuh atas pesan SOAP. Dalam sampel ini, atribut MessageHeaderAttribute digunakan untuk meletakkan Operation di header SOAP. Operand N1, N2 dan Result muncul di dalam isi SOAP karena mereka memiliki atribut MessageBodyMemberAttribute yang diterapkan.

[MessageContract]
public class MyMessage
{
    private string operation;
    private double n1;
    private double n2;
    private double result;

    //Constructor - create an empty message.

    public MyMessage() {}

    //Constructor - create a message and populate its members.

    public MyMessage(double n1, double n2, string operation,
                     double result)
    {
        this.n1 = n1;
        this.n2 = n2;
        this.operation = operation;
        this.result = result;
    }

    //Constructor - create a message from another message.

    public MyMessage(MyMessage message)
    {
        this.n1 = message.n1;
        this.n2 = message.n2;
        this.operation = message.operation;
        this.result = message.result;
    }

    [MessageHeader]
    public string Operation
    {
        get { return operation; }
        set { operation = value; }
    }

    [MessageBodyMember]
    public double N1
    {
        get { return n1; }
        set { n1 = value; }
    }

    [MessageBodyMember]
    public double N2
    {
        get { return n2; }
        set { n2 = value; }
    }

    [MessageBodyMember]
    public double Result
    {
        get { return result; }
        set { result = value; }
    }
}

Kelas implementasi berisi kode untuk operasi layanan Calculate. Kelas CalculateService mendapatkan operand dan operator dari pesan permintaan dan membuat pesan respons yang berisi hasil penghitungan yang diminta, seperti yang ditunjukkan dalam kode sampel berikut.

// Service class which implements the service contract.
public class CalculatorService : ICalculator
{
    // Perform a calculation.

    public MyMessage Calculate(MyMessage request)
    {
        MyMessage response = new MyMessage(request);
        switch (request.Operation)
        {
            case "+":
                response.Result = request.N1 + request.N2;
                break;
            case "-":
                response.Result = request.N1 - request.N2;
                break;
            case "*":
                response.Result = request.N1 * request.N2;
                break;
            case "/":
                response.Result = request.N1 / request.N2;
                break;
            default:
                response.Result = 0.0D;
                break;
        }
        return response;
    }
}

Kode klien yang dihasilkan untuk klien dibuat dengan alat Alat Utilitas Metadata ServiceModel (Svcutil.exe). Alat ini secara otomatis membuat jenis kontrak pesan dalam kode klien yang dihasilkan jika perlu. Opsi perintah /messageContract dapat ditentukan untuk memaksa pembuatan kontrak pesan.

svcutil.exe /n:"http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples" /o:client\generatedClient.cs http://localhost/servicemodelsamples/service.svc/mex

Sampel kode berikut menunjukkan klien menggunakan pesan MyMessage.

// Create a client with given client endpoint configuration
CalculatorClient client = new CalculatorClient();

// Perform addition using a typed message.

MyMessage request = new MyMessage()
                    {
                        N1 = 100D,
                        N2 = 15.99D,
                        Operation = "+"
                    };
MyMessage response = ((ICalculator)client).Calculate(request);
Console.WriteLine("Add({0},{1}) = {2}", request.N1, request.N2, response.Result);

Saat Anda menjalankan sampel, perhitungan ditampilkan di jendela konsol klien. Tekan ENTER di jendela klien untuk mematikan komputer klien.

Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25
Divide(22,7) = 3.14285714285714

Press <ENTER> to terminate client.

Pada titik ini, pesan kustom yang ditentukan pengguna telah berlalu antara klien dan operasi layanan. Kontrak pesan menentukan bahwa operand dan hasil berada di isi pesan dan bahwa operator berada di header pesan. Pengelogan pesan dapat dikonfigurasi untuk mengamati struktur pesan ini.

Untuk menyiapkan, membangun, dan menjalankan sampel

  1. Pastikan Anda telah melakukan Prosedur Penyiapan Satu Kali untuk Sampel Windows Communication Foundation.

  2. Untuk membangun solusi edisi C# atau Visual Basic .NET, ikuti petunjuknya di Membangun Sampel WCF.

  3. Untuk menjalankan sampel dalam konfigurasi satu atau lintas komputer, ikuti instruksi pada Menjalankan Sampel WCF.