Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Oturum örneği, Message Queuing (MSMQ) aktarımı üzerinden kuyruklu iletişimde ilgili bir dizi iletinin nasıl gönderilip alınacağını gösterir. Bu örnek bağlamayı netMsmqBinding kullanır. Hizmet, kuyruğa alınmış iletileri alan servisi takip etmenize olanak tanıyan kendi kendine barındırılan bir konsol uygulamasıdır.
Uyarı
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ın bu modeli sergilemesi için bir işlem gereklidir.
Örnekte istemci, tek bir işlem kapsamında bir oturumun parçası olarak hizmete bir dizi ileti gönderir.
Hizmet sözleşmesi, kuyruklarla kullanıma uygun tek yönlü bir hizmeti tanımlar. 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şleme dahil edildiği ancak işlemin otomatik olarak tamamlanmadığı ş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 operasyon başarıyla tamamlandıktan sonra, işlem taahhüt edilir. Hizmet, aynı hizmet örneğindeki bir oturumdaki tüm iletileri almak için PerSession'yi InstanceContextMode olarak kullanır.
[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 sunucunuzda 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ı, AppSettings sınıfını kullanarak yapılandırma dosyasından 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 appSettings 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, Complete çağrılarak gerçekleştirilir.
//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();
}
Uyarı
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çinOne-Time Kurulum Yordamını yaptığınızdan 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 bir makine veya makineler arası bir yapılandırmada çalıştırmak için, Windows Communication Foundation örneklerini çalıştırmayönergelerini izleyin.
varsayılan olarak, NetMsmqBinding aktarım güvenliği etkindir. MSMQ aktarım güvenliği için iki ilgili özellik vardır, yani MsmqAuthenticationMode ve MsmqProtectionLevel.. Varsayılan olarak, kimlik doğrulama modu Windows ve koruma düzeyi Sign olarak ayarlanmıştı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
Noneolarak 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.
Uyarı
Güvenlik modunu
Noneolarak ayarlamak, MsmqAuthenticationMode, MsmqProtectionLevel veMessagegüvenliğiniNoneolarak ayarlamakla eşdeğerdir.