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 Sesi menunjukkan cara mengirim dan menerima sekumpulan pesan terkait dalam komunikasi yang diantrikan melalui protokol Antrean Pesan (MSMQ). Sampel ini menggunakan pengikatan netMsmqBinding . Layanan ini adalah aplikasi konsol yang dihost sendiri untuk memungkinkan Anda mengamati layanan yang menerima pesan antrean.
Nota
Prosedur penyiapan dan instruksi build untuk sampel ini terletak di akhir topik ini.
Dalam komunikasi antrian, klien berkomunikasi dengan layanan menggunakan antrian. Lebih tepatnya, klien mengirim pesan ke daftar antrian. Layanan menerima pesan dari antrean. Oleh karena itu, layanan dan klien tidak harus beroperasi pada saat yang bersamaan untuk berkomunikasi menggunakan antrean.
Terkadang, klien mengirim sekumpulan pesan yang terkait satu sama lain dalam grup. Ketika pesan harus diproses bersama atau dalam urutan tertentu, antrean dapat digunakan untuk mengelompokkannya bersama-sama, untuk diproses oleh satu aplikasi penerima. Ini sangat penting ketika ada beberapa aplikasi penerima di sekelompok server dan perlu untuk memastikan bahwa sekelompok pesan diproses oleh aplikasi penerima yang sama. Sesi antrean adalah mekanisme yang digunakan untuk mengirim dan menerima serangkaian pesan terkait yang harus diproses sekaligus. Sesi antrean memerlukan transaksi untuk menunjukkan pola ini.
Dalam sampel, klien mengirim sejumlah pesan ke layanan sebagai bagian dari sesi dalam cakupan satu transaksi.
Kontrak layanan adalah IOrderTaker, yang mendefinisikan layanan satu arah yang cocok untuk digunakan dengan antrean.
SessionMode yang digunakan dalam kontrak yang tercantum dalam kode sampel berikut ini menandakan bahwa pesan adalah bagian dari sesi.
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples", SessionMode=SessionMode.Required)]
public interface IOrderTaker
{
[OperationContract(IsOneWay = true)]
void OpenPurchaseOrder(string customerId);
[OperationContract(IsOneWay = true)]
void AddProductLineItem(string productId, int quantity);
[OperationContract(IsOneWay = true)]
void EndPurchaseOrder();
}
Layanan mendefinisikan operasi layanan sedemikian rupa sehingga operasi pertama turut serta dalam sebuah transaksi tetapi tidak menyelesaikan transaksi secara otomatis. Operasi berikutnya juga ikut serta dalam transaksi yang sama tetapi tidak diselesaikan secara otomatis. Operasi terakhir dalam sesi secara otomatis menyelesaikan transaksi. Dengan demikian, transaksi yang sama digunakan untuk beberapa pemanggilan operasi dalam kontrak layanan. Jika salah satu operasi memunculkan pengecualian, maka transaksi dibatalkan dan sesi dimasukkan kembali ke dalam antrian. Setelah berhasil menyelesaikan operasi terakhir, transaksi dilakukan. Layanan ini menggunakan PerSession sebagai InstanceContextMode untuk menerima semua pesan dalam sesi pada instans layanan yang sama.
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
public class OrderTakerService : IOrderTaker
{
PurchaseOrder po;
[OperationBehavior(TransactionScopeRequired = true,
TransactionAutoComplete = false)]
public void OpenPurchaseOrder(string customerId)
{
Console.WriteLine("Creating purchase order");
po = new PurchaseOrder(customerId);
}
[OperationBehavior(TransactionScopeRequired = true,
TransactionAutoComplete = false)]
public void AddProductLineItem(string productId, int quantity)
{
po.AddProductLineItem(productId, quantity);
Console.WriteLine("Product " + productId + " quantity " +
quantity + " added to purchase order");
}
[OperationBehavior(TransactionScopeRequired = true,
TransactionAutoComplete = true)]
public void EndPurchaseOrder()
{
Console.WriteLine("Purchase Order Completed");
Console.WriteLine();
Console.WriteLine(po.ToString());
}
}
Layanan ini dihost sendiri. Saat menggunakan protokol transportasi MSMQ, antrean yang digunakan harus dibuat terlebih dahulu. Ini dapat dilakukan secara manual atau melalui kode. Dalam sampel ini, layanan berisi System.Messaging kode untuk memeriksa keberadaan antrean dan membuatnya, jika perlu. Nama antrean dibaca dari file konfigurasi dengan menggunakan kelas AppSettings.
// Host the service within this EXE console application.
public static void Main()
{
// Get MSMQ queue name from app settings in configuration.
string queueName = ConfigurationManager.AppSettings["queueName"];
// Create the transacted MSMQ queue if necessary.
if (!MessageQueue.Exists(queueName))
MessageQueue.Create(queueName, true);
// Create a ServiceHost for the OrderTakerService type.
using (ServiceHost serviceHost = new ServiceHost(typeof(OrderTakerService)))
{
// Open the ServiceHost to create listeners and start listening for messages.
serviceHost.Open();
// The service can now be accessed.
Console.WriteLine("The service is ready.");
Console.WriteLine("Press <ENTER> to terminate service.");
Console.WriteLine();
Console.ReadLine();
// Close the ServiceHost to shutdown the service.
serviceHost.Close();
}
}
Nama antrean MSMQ ditentukan di bagian appSettings dari file konfigurasi. Titik akhir untuk layanan ditentukan di bagian system.serviceModel dari file konfigurasi dan menentukan pengikatan netMsmqBinding .
<appSettings>
<!-- Use appSetting to configure MSMQ queue name. -->
<add key="queueName" value=".\private$\ServiceModelSamplesSession" />
</appSettings>
<system.serviceModel>
<services>
<service name="Microsoft.ServiceModel.Samples.OrderTakerService"
behaviorConfiguration="CalculatorServiceBehavior">
...
<!-- Define NetMsmqEndpoint -->
<endpoint address="net.msmq://localhost/private/ServiceModelSamplesSession"
binding="netMsmqBinding"
contract="Microsoft.ServiceModel.Samples.IOrderTaker" />
...
</service>
</services>
...
</system.serviceModel>
Klien membuat cakupan transaksi. Semua pesan dalam sesi dikirim ke antrean dalam cakupan transaksi, sehingga diperlakukan sebagai kesatuan atom di mana semua pesan berhasil atau gagal. Transaksi dilakukan dengan memanggil Complete.
//Create a transaction scope.
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
// Create a client with given client endpoint configuration.
OrderTakerClient client = new OrderTakerClient("OrderTakerEndpoint");
// Open a purchase order.
client.OpenPurchaseOrder("somecustomer.com");
Console.WriteLine("Purchase Order created");
// Add product line items.
Console.WriteLine("Adding 10 quantities of blue widget");
client.AddProductLineItem("Blue Widget", 10);
Console.WriteLine("Adding 23 quantities of red widget");
client.AddProductLineItem("Red Widget", 23);
// Close the purchase order.
Console.WriteLine("Closing the purchase order");
client.EndPurchaseOrder();
//Closing the client gracefully closes the connection and cleans up resources.
client.Close();
// Complete the transaction.
scope.Complete();
}
Nota
Anda hanya dapat menggunakan satu transaksi untuk semua pesan dalam sesi dan semua pesan dalam sesi harus dikirim sebelum melakukan transaksi. Menutup klien menutup sesi. Oleh karena itu, klien harus dinonaktifkan sebelum transaksi selesai untuk mengirim semua pesan dalam sesi ke antrian.
Saat Anda menjalankan sampel, aktivitas klien dan layanan ditampilkan di jendela layanan dan konsol klien. Anda dapat melihat layanan menerima pesan dari klien. Tekan ENTER di setiap jendela konsol untuk mematikan layanan dan klien. Karena antrean sedang digunakan, klien dan penyedia layanan tidak harus aktif dan beroperasi pada saat yang sama. Anda dapat menjalankan klien, mematikannya, lalu memulai layanan dan masih menerima pesannya.
Pada klien tersebut.
Purchase Order created
Adding 10 quantities of blue widget
Adding 23 quantities of red widget
Closing the purchase order
Press <ENTER> to terminate client.
Tentang layanan.
The service is ready.
Press <ENTER> to terminate service.
Creating purchase order
Product Blue Widget quantity 10 added to purchase order
Product Red Widget quantity 23 added to purchase order
Purchase Order Completed
Purchase Order: 7c86fef0-2306-4c51-80e6-bcabcc1a6e5e
Customer: somecustomer.com
OrderDetails
Order LineItem: 10 of Blue Widget @unit price: $2985
Order LineItem: 23 of Red Widget @unit price: $156
Total cost of this order: $33438
Order status: Pending
Menyiapkan, membangun, dan menjalankan sampel
Pastikan Anda telah melakukan Prosedur Penyiapan One-Time untuk Sampel Windows Communication Foundation.
Untuk membangun solusi edisi C#, C++, atau Visual Basic .NET, ikuti instruksi dalam Membangun Sampel Windows Communication Foundation.
Untuk menjalankan sampel dalam konfigurasi satu atau lintas komputer, ikuti instruksi di Menjalankan Sampel Windows Communication Foundation.
Secara default dengan NetMsmqBinding, keamanan transportasi diaktifkan. Ada dua properti yang relevan untuk keamanan transportasi MSMQ yaitu, MsmqAuthenticationMode dan MsmqProtectionLevel. Secara default, mode autentikasi diatur ke Windows dan tingkat perlindungan diatur ke Sign. Agar MSMQ menyediakan fitur autentikasi dan penandatanganan, MSMQ harus menjadi bagian dari domain dan opsi integrasi direktori aktif untuk MSMQ harus diinstal. Jika Anda menjalankan sampel ini pada komputer yang tidak memenuhi kriteria ini, Anda menerima kesalahan.
Menjalankan sampel di komputer yang bergabung ke grup kerja
Jika komputer Anda bukan bagian dari domain atau tidak memiliki integrasi direktori aktif yang terinstal, nonaktifkan keamanan transportasi dengan mengatur mode autentikasi dan tingkat perlindungan ke
Noneseperti yang ditunjukkan dalam konfigurasi sampel berikut.<system.serviceModel> <services> <service name="Microsoft.ServiceModel.Samples.OrderTakerService" behaviorConfiguration="OrderTakerServiceBehavior"> <host> <baseAddresses> <add baseAddress= "http://localhost:8000/ServiceModelSamples/service"/> </baseAddresses> </host> <!-- Define NetMsmqEndpoint --> <endpoint address= "net.msmq://localhost/private/ServiceModelSamplesSession" binding="netMsmqBinding" bindingConfiguration="Binding1" contract="Microsoft.ServiceModel.Samples.IOrderTaker" /> <!-- The mex endpoint is exposed at--> <!--http://localhost:8000/ServiceModelSamples/service/mex. --> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> </service> </services> <bindings> <netMsmqBinding> <binding name="Binding1"> <security mode="None" /> </binding> </netMsmqBinding> </bindings> <behaviors> <serviceBehaviors> <behavior name="OrderTakerServiceBehavior"> <serviceMetadata httpGetEnabled="True"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel>Pastikan Anda mengubah konfigurasi di server dan klien sebelum menjalankan sampel.
Nota
Mengatur mode keamanan ke
Nonesetara dengan pengaturan MsmqAuthenticationMode, , MsmqProtectionLeveldanMessagekeamanan keNone.