Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Sampel Kontrak Pesan Default menunjukkan layanan di mana pesan kustom yang ditentukan oleh pengguna dikirim dan diterima kembali dari operasi layanan. Sampel ini didasarkan pada Memulai yang mengimplementasikan antarmuka kalkulator sebagai layanan ketik. Alih-alih operasi layanan individual untuk penambahan, pengurangan, perkalian, dan pembagian yang digunakan dalam Memulai, sampel ini meneruskan pesan kustom yang berisi operand dan operator, dan mengembalikan hasil perhitungan aritmatika.
Klien adalah program konsol (.exe) dan pustaka layanan (.dll) dihosting oleh Internet Information Services (IIS). Aktivitas klien terlihat di jendela konsol.
Nota
Prosedur penyiapan dan instruksi build untuk sampel ini terletak di akhir topik ini.
Dalam layanan, operasi layanan tunggal didefinisikan yang menerima dan mengembalikan pesan kustom jenis MyMessage. Meskipun dalam sampel ini pesan permintaan dan respons berjenis yang sama, mereka 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 dianotasi dengan atribut MessageContractAttribute, MessageHeaderAttribute, dan MessageBodyMemberAttribute. Hanya konstruktor ketiga yang digunakan dalam contoh ini. Menggunakan kontrak pesan memungkinkan Anda untuk melakukan kontrol penuh atas pesan SOAP. Dalam sampel ini, atribut MessageHeaderAttribute digunakan untuk menempatkan Operation dalam header SOAP. Operan N1, N2 dan Result muncul dalam isi SOAP karena mereka memiliki MessageBodyMemberAttribute atribut 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 Calculate operasi layanan. 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 dibuat dengan menggunakan Alat Utilitas Metadata ServiceModel (Svcutil.exe) untuk klien. Alat ini secara otomatis membuat jenis kontrak pesan dalam kode klien yang dihasilkan jika perlu. Opsi /messageContract perintah dapat ditentukan untuk mengharuskan pembuatan kontrak pesan.
svcutil.exe /n:"http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples" /o:client\generatedClient.cs http://localhost/servicemodelsamples/service.svc/mex
Kode sampel berikut menunjukkan klien menggunakan MyMessage pesan .
// 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 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 mendefinisikan 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, mengompilasi, dan menjalankan sampel
Pastikan Anda telah melakukan Prosedur Penyiapan One-Time untuk Sampel Windows Communication Foundation.
Untuk membangun solusi edisi C# atau Visual Basic .NET, ikuti instruksi di Membangun Sampel Windows Communication Foundation.
Untuk menjalankan sampel dalam konfigurasi satu atau lintas komputer, ikuti instruksi di Menjalankan Sampel Windows Communication Foundation.