Aracılığıyla paylaş


Değişken 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 örnek NetMsmqBinding kullanır. Bu durumda hizmet, kuyruğa alınmış mesajların alındığını gözlemleyebilmeniz için 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.

Güvencesi olmayan bir ileti gönderdiğinizde MSMQ, iletiyi teslim etmek için yalnızca en iyi çabayı gösterir. Kesinlikle Bir Kez güvenceleri ile ise MSMQ, iletiyi ya kesin olarak teslim eder ya da teslim edilemediği durumda sizi bilgilendirir.

Belirli senaryolarda, iletileri kaybetmektense zamanında teslimin daha önemli olduğu durumlarda kuyruk üzerinde güvence olmadan geçici bir ileti göndermek isteyebilirsiniz. Geçici iletiler, kuyruk yöneticisi çöktüğünde korunmaz. 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.

Uyarı

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 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 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 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.

Uyarı

Yerel makine için kuyruk adı nokta (.) kullanır ve System.Messaging kullanarak bir kuyruk oluştururken yolunda ters eğik çizgi ayırıcıları kullanır. Windows Communication Foundation (WCF) uç noktası adresi .net.msmq: şeması belirtir, yerel makine için "localhost" kullanır ve yolunda ileri eğik çizgiler 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çinOne-Time Kurulum Yordamını yaptığınızdan emin olun.

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

  3. Ö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 MsmqAuthenticationMode ve MsmqProtectionLevel. olmak üzere iki ilgili özellik vardır. Varsayılan olarak, kimlik doğrulama modu Windows ve koruma düzeyi Sign olarak 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 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.

    Uyarı

    Ayarı security modeNone, MsmqAuthenticationMode, MsmqProtectionLevel ve Message güvenliğini None olarak ayarlamakla eşdeğerdir.