Oturumlar ve kuyruklar
Oturum örneği, Message Queuing (MSMQ) aktarımı üzerinden kuyruğa alınmış iletişimde bir dizi ilgili iletinin nasıl gönderilip alınyacağını gösterir. Bu örnek bağlamayı netMsmqBinding
kullanır. Hizmet, kuyruğa alınmış iletileri alan hizmeti gözlemlemenizi sağlayan şirket içinde barındırılan bir konsol uygulamasıdır.
Not
Bu örnek için kurulum yordamı ve derleme yönergeleri bu konunun sonunda yer alır.
Kuyruğa alınan iletişimde, istemci bir kuyruk kullanarak hizmetle iletişim kurar. Daha kesin olarak, istemci bir kuyruğa ileti gönderir. Hizmet kuyruktan iletiler alır. Bu nedenle hizmet ve istemcinin kuyruk kullanarak iletişim kurmak için aynı anda çalışması gerekmez.
Bazen istemci, bir grupta birbiriyle ilişkili bir dizi ileti gönderir. İletilerin birlikte veya belirli bir sırada işlenmesi gerektiğinde, tek bir alıcı uygulama tarafından işlenmek üzere bunları gruplandırmak için bir kuyruk kullanılabilir. Bu özellikle bir sunucu grubunda birkaç alıcı uygulama olduğunda ve bir ileti grubunun aynı alıcı uygulama tarafından işlendiğinden emin olmak gerektiğinde önemlidir. Kuyruğa alınan oturumlar, bir kerede işlenmesi gereken ilgili bir ileti kümesi göndermek ve almak için kullanılan bir mekanizmadır. Kuyruğa alınan oturumlar bu düzenin sergilenmek için bir işlem gerektirir.
Örnekte istemci, tek bir işlem kapsamında bir oturumun parçası olarak hizmete bir dizi ileti gönderir.
Hizmet sözleşmesi, IOrderTaker
kuyruklarla kullanıma uygun tek yönlü bir hizmeti tanımlayan şeklindedir. SessionMode Aşağıdaki örnek kodda gösterilen sözleşmede kullanılan, iletilerin oturumun bir parçası olduğunu gösterir.
[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();
}
Hizmet, hizmet işlemlerini, ilk işlemin bir işlemde listelendiğini ancak işlemi otomatik olarak tamamlamadığı şekilde tanımlar. Sonraki işlemler de aynı işlemde yer alır, ancak otomatik olarak tamamlanmaz. Oturumdaki son işlem işlemi otomatik olarak tamamlar. Bu nedenle, aynı işlem hizmet sözleşmesindeki çeşitli işlem çağrıları için kullanılır. İşlemlerden herhangi biri özel durum oluşturursa işlem geri alınır ve oturum yeniden kuyruğa alınır. Son işlem başarıyla tamamlandıktan sonra işlem işlenir. Hizmet, aynı hizmet örneğindeki bir oturumdaki tüm iletileri almak için olarak kullanır PerSession
InstanceContextMode .
[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());
}
}
Hizmet kendi kendine barındırılır. MSMQ aktarımı kullanılırken, kullanılan kuyruk önceden oluşturulmalıdır. Bu, el ile veya kod aracılığıyla yapılabilir. Bu örnekte hizmet, kuyruğun varlığını denetlemek için kod içerir System.Messaging ve gerekirse bunu oluşturur. Kuyruk adı, sınıfı kullanılarak yapılandırma dosyasından AppSettings okunur.
// 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();
}
}
MSMQ kuyruğu adı, yapılandırma dosyasının bir uygulama Ayarlar bölümünde belirtilir. Hizmetin uç noktası yapılandırma dosyasının system.serviceModel bölümünde tanımlanır ve bağlamayı netMsmqBinding
belirtir.
<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>
İstemci bir işlem kapsamı oluşturur. Oturumdaki tüm iletiler işlem kapsamındaki kuyruğa gönderilir ve bu da tüm iletilerin başarılı veya başarısız olduğu atomik bir birim olarak ele alınmasına neden olur. İşlem çağrılarak Completeişlenir.
//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();
}
Not
Oturumdaki tüm iletiler için yalnızca tek bir işlem kullanabilirsiniz ve işlemi işlemeden önce oturumdaki tüm iletilerin gönderilmesi gerekir. İstemci kapatılıyorsa oturum kapatılıyor. Bu nedenle, oturumdaki tüm iletileri kuyruğa göndermek için işlem tamamlanmadan önce istemcinin kapatılması gerekir.
Örneği çalıştırdığınızda, istemci ve hizmet etkinlikleri hem hizmet hem de istemci konsol pencerelerinde görüntülenir. Hizmetin istemciden ileti aldığını görebilirsiniz. Hizmeti ve istemciyi kapatmak için her konsol penceresinde ENTER tuşuna basın. Kuyruğa alma kullanımda olduğundan istemci ve hizmetin aynı anda çalışır durumda olması gerekmez. İstemciyi çalıştırabilir, kapatabilir, ardından hizmeti başlatabilir ve yine de iletilerini alabilirsiniz.
İstemcide.
Purchase Order created
Adding 10 quantities of blue widget
Adding 23 quantities of red widget
Closing the purchase order
Press <ENTER> to terminate client.
Hizmette.
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
Örneği ayarlama, derleme ve çalıştırma
Windows Communication Foundation Örnekleri için Tek Seferlik Kurulum Yordamı'nı gerçekleştirdiğinizden emin olun.
Çözümün C#, C++ veya Visual Basic .NET sürümünü oluşturmak için Windows Communication Foundation Örnekleri Oluşturma başlığı altındaki yönergeleri izleyin.
Örneği tek veya makineler arası bir yapılandırmada çalıştırmak için Windows Communication Foundation Örneklerini Çalıştırma başlığındaki yönergeleri izleyin.
varsayılan olarak , NetMsmqBindingaktarım güvenliği etkindir. MSMQ aktarım güvenliği MsmqAuthenticationMode için iki ilgili özellik vardır ve.
MsmqProtectionLevelVarsayılan olarak, kimlik doğrulama modu olarak ve Windows
koruma düzeyi olarak Sign
ayarlanır. MSMQ'nun kimlik doğrulama ve imzalama özelliğini sağlaması için bir etki alanının parçası olması ve MSMQ için Active Directory tümleştirme seçeneğinin yüklü olması gerekir. Bu örneği bu ölçütleri karşılamayan bir bilgisayarda çalıştırırsanız bir hata alırsınız.
Örneği çalışma grubuna katılmış bir bilgisayarda çalıştırma
Bilgisayarınız bir etki alanının parçası değilse veya Active Directory tümleştirmesi yüklü değilse, aşağıdaki örnek yapılandırmada gösterildiği gibi kimlik doğrulama modunu ve koruma düzeyini
None
olarak ayarlayarak aktarım güvenliğini kapatın.<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>
Örneği çalıştırmadan önce hem sunucuda hem de istemcide yapılandırmayı değiştirdiğinizden emin olun.
Not
Güvenlik modunu olarak
None
ayarlamak, , MsmqProtectionLevelveMessage
güvenliğini olarak ayarlamakla MsmqAuthenticationModeNone
eşdeğerdir.