Aracılığıyla paylaş


Geçici Kuyruğa Alınmış İletişim

Geçici örnek, Message Queuing (MSMQ) aktarımı üzerinden geçici kuyruğa alınmış iletişimin nasıl gerçekleştirileceklerini gösterir. Bu örnekte kullanılır NetMsmqBinding. Bu durumda 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.

Güvencesi olmayan bir ileti gönderdiğinizde MSMQ, MSMQ'nin iletinin teslim edilmesini sağladığı veya teslim edilemediği durumlarda iletinin teslim edilemeyeceğini bildiğiniz Tam Bir Kez güvencelerinden farklı olarak, iletiyi teslim etmek için yalnızca en iyi çabayı gösterir.

Belirli senaryolarda, zamanında teslimin iletileri kaybetmekten daha önemli olduğu durumlarda kuyruk üzerinde güvence olmadan geçici bir ileti göndermek isteyebilirsiniz. Geçici iletiler kuyruk yöneticisinin kilitlenmelerinden kurtulmuyor. Bu nedenle, kuyruk yöneticisi kilitlenirse, geçici iletileri depolamak için kullanılan işlem dışı kuyruk hayatta kalır, ancak iletiler diskte depolanmadığından iletilerin kendileri bunu yapmaz.

Not

MSMQ kullanarak bir işlem kapsamında güvencesi olmayan geçici iletiler gönderemezsiniz. Geçici iletiler göndermek için işlem dışı bir kuyruk da oluşturmanız gerekir.

Bu örnekteki hizmet sözleşmesi, kuyruğa alma için en uygun tek yönlü hizmetleri tanımlayan sözleşmedir IStockTicker .

[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
public interface IStockTicker
{
    [OperationContract(IsOneWay = true)]
    void StockTick(string symbol, float price);
}

Hizmet işlemi, aşağıdaki örnek kodda gösterildiği gibi hisse senedi değer çizgisi simgesini ve fiyatını görüntüler:

public class StockTickerService : IStockTicker
{
    public void StockTick(string symbol, float price)
    {
        Console.WriteLine("Stock Tick {0}:{1} ", symbol, price);
     }
     …
}

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 ve gerekirse oluşturmak için kod içerir. Kuyruk adı yapılandırma dosyasından okunur. Temel adres ServiceModel Meta Veri Yardımcı Programı Aracı (Svcutil.exe) tarafından hizmetin ara sunucusunu oluşturmak için kullanılır.

// 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);

    // Create a ServiceHost for the StockTickerService type.
    using (ServiceHost serviceHost = new ServiceHost(typeof(StockTickerService)))
    {
        // 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 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.

Not

Kuyruk adı, kullanarak System.Messagingbir kuyruk oluştururken yerel makine için nokta (.) ve yolunda ters eğik çizgi ayırıcıları kullanır. Windows Communication Foundation (WCF) uç noktası adresi bir net.msmq: şeması belirtir, yerel makine için "localhost" kullanır ve yolunda eğik çizgi kullanır.

İletilerin güvenceleri ve dayanıklılığı veya volatilitesi de yapılandırmada belirtilir.

<appSettings>
  <!-- use appSetting to configure MSMQ queue name -->
  <add key="queueName" value=".\private$\ServiceModelSamplesVolatile" />
</appSettings>

<system.serviceModel>
  <services>
    <service name="Microsoft.ServiceModel.Samples.StockTickerService"
             behaviorConfiguration="CalculatorServiceBehavior">
    ...
      <!-- Define NetMsmqEndpoint -->
      <endpoint address="net.msmq://localhost/private/ServiceModelSamplesVolatile"
                binding="netMsmqBinding"
                bindingConfiguration="volatileBinding"
                contract="Microsoft.ServiceModel.Samples.IStockTicker" />
    ...
    </service>
  </services>

  <bindings>
    <netMsmqBinding>
      <binding name="volatileBinding"
             durable="false"
           exactlyOnce="false"/>
    </netMsmqBinding>
  </bindings>
  ...
</system.serviceModel>

Örnek, işlem dışı bir kuyruk kullanarak kuyruğa alınmış iletiler gönderdiğinden, işlem yapılan iletiler kuyruğa gönderilemez.

// Create a client.
Random r = new Random(137);

StockTickerClient client = new StockTickerClient();

float price = 43.23F;
for (int i = 0; i < 10; i++)
{
    float increment = 0.01f * (r.Next(10));
    client.StockTick("zzz" + i, price + increment);
}

//Closing the client gracefully cleans up resources.
client.Close();

Ö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 istemcinin ve hizmetin aynı anda çalışır durumda olması gerekmediğini unutmayın. İstemciyi çalıştırabilir, kapatabilir, ardından hizmeti başlatabilir ve yine de iletilerini alabilirsiniz.

The service is ready.
Press <ENTER> to terminate service.

Stock Tick zzz0:43.25
Stock Tick zzz1:43.23
Stock Tick zzz2:43.28
Stock Tick zzz3:43.3
Stock Tick zzz4:43.23
Stock Tick zzz5:43.25
Stock Tick zzz6:43.25
Stock Tick zzz7:43.24
Stock Tick zzz8:43.32
Stock Tick zzz9:43.3

Örneği ayarlamak, derlemek ve çalıştırmak için

  1. Windows Communication Foundation Örnekleri için Tek Seferlik Kurulum Yordamı'nı gerçekleştirdiğinizden emin olun.

  2. Çözümün C# veya Visual Basic .NET sürümünü oluşturmak için Windows Communication Foundation Örnekleri Oluşturma başlığındaki yönergeleri izleyin.

  3. Ö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 Signayarlanı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 bir çalışma grubuna katılmış bir bilgisayarda veya Active Directory tümleştirmesi olmadan çalıştırmak için

  1. 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ırma kodunda 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.StockTickerService"
                   behaviorConfiguration="StockTickerServiceBehavior">
            <host>
              <baseAddresses>
                <add baseAddress="http://localhost:8000/ServiceModelSamples/service"/>
              </baseAddresses>
            </host>
    
            <!-- Define NetMsmqEndpoint -->
            <endpoint address="net.msmq://localhost/private/ServiceModelSamplesVolatile"
                      binding="netMsmqBinding"
                      bindingConfiguration="volatileBinding"
                      contract="Microsoft.ServiceModel.Samples.IStockTicker" />
            <!-- 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="volatileBinding"
                  durable="false"
                  exactlyOnce="false">
              <security mode="None" />
            </binding>
          </netMsmqBinding>
        </bindings>
    
        <behaviors>
          <serviceBehaviors>
            <behavior name="StockTickerServiceBehavior">
              <serviceMetadata httpGetEnabled="True"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
    
      </system.serviceModel>
    
  2. Örneği çalıştırmadan önce hem sunucuda hem de istemcide yapılandırmayı değiştirdiğinizden emin olun.

    Not

    ayarı security modeNone, , MsmqProtectionLevelve Message güvenliğini olarak ayarlamakla MsmqAuthenticationModeNoneeşdeğerdir.