次の方法で共有


揮発性キュー通信

Volatile サンプルは、メッセージ キュー (MSMQ) トランスポート経由で揮発性キュー通信を実行する方法を示しています。 このサンプルでは、 NetMsmqBindingを使用します。 この場合のサービスは、キューに登録されたメッセージを受信しているサービスを監視できるようにするためのセルフホステッド コンソール アプリケーションです。

このサンプルのセットアップ手順とビルド手順は、このトピックの最後にあります。

キュー通信では、クライアントはキューを使用してサービスと通信します。 より正確には、クライアントはメッセージをキューに送信します。 サービスはキューからメッセージを受信します。 そのため、サービスとクライアントは、キューを使用して通信するために同時に実行する必要はありません。

保証なしでメッセージを送信する場合、MSMQ はメッセージを配信するためのベスト エフォートのみを行います。MSMQ では、メッセージが確実に配信されるか、配信できない場合は、メッセージを配信できないことを知ることができます。

特定のシナリオでは、メッセージを失うよりもタイムリーな配信が重要な場合に、キューに対して保証なしで揮発性メッセージを送信することが必要な場合があります。 揮発性メッセージは、キュー・マネージャーのクラッシュ後も存続しません。 したがって、キュー・マネージャーがクラッシュした場合、揮発性メッセージの保管に使用される非トランザクション・キューは存続しますが、メッセージ自体はディスクに保管されていないためには存続しません。

MSMQ を使用してトランザクションのスコープ内で保証なしで揮発性メッセージを送信することはできません。 揮発性メッセージを送信するには、非トランザクション キューも作成する必要があります。

このサンプルのサービス コントラクトは、キューでの使用に最適な一方向サービスを定義する IStockTicker です。

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

サービス操作では、次のサンプル コードに示すように、株価ティッカーのシンボルと価格が表示されます。

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

サービスはセルフ ホステッドです。 MSMQ トランスポートを使用する場合は、使用するキューを事前に作成する必要があります。 これは、手動またはコードを使用して行うことができます。 このサンプルでは、サービスにキューの存在を確認し、必要に応じて作成するコードが含まれています。 キュー名は構成ファイルから読み取られます。 ベース アドレスは、 ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe) によってサービスのプロキシを生成するために使用されます。

// 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 キュー名は、構成ファイルの appSettings セクションで指定します。 サービスのエンドポイントは、構成ファイルの system.serviceModel セクションで定義され、 netMsmqBinding バインドを指定します。

キュー名は、ローカル コンピューターにドット (.) を使用し、 System.Messagingを使用してキューを作成するときにパスに円記号の区切り記号を使用します。 Windows Communication Foundation (WCF) エンドポイント アドレスは、net.msmq: スキームを指定し、ローカル コンピューターに "localhost" を使用し、パスにスラッシュを使用します。

メッセージの保証と持続性または揮発性も構成で指定されます。

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

このサンプルでは、非トランザクション キューを使用してキューに登録されたメッセージを送信するため、トランザクション メッセージをキューに送信することはできません。

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

サンプルを実行すると、クライアントとサービスのアクティビティが、サービスとクライアントの両方のコンソール ウィンドウに表示されます。 サービスがクライアントからメッセージを受信しているのを確認できます。 各コンソール ウィンドウで Enter キーを押して、サービスとクライアントをシャットダウンします。 キューが使用されているため、クライアントとサービスを同時に起動して実行する必要はありません。 クライアントを実行してシャットダウンし、サービスを起動しても、メッセージを受信できます。

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

サンプルを設定、ビルド、実行するには

  1. Windows Communication Foundation サンプル One-Time セットアップ手順を実行していることを確認します。

  2. ソリューションの C# または Visual Basic .NET エディションをビルドするには、「Windows Communication Foundation サンプルのビルド」の手順に従います。

  3. 単一または複数のコンピューター間の構成でサンプルを実行するには、「Windows Communication Foundation Samplesの実行」の手順に従います。

既定では、 NetMsmqBindingではトランスポート セキュリティが有効になっています。 MSMQ トランスポート セキュリティには 2 つの関連プロパティがあります。 MsmqAuthenticationModeMsmqProtectionLevel. 既定では、認証モードは Windows に設定され、保護レベルは Sign に設定されます。 MSMQ で認証と署名機能を提供するには、ドメインの一部である必要があり、MSMQ の Active Directory 統合オプションをインストールする必要があります。 これらの条件を満たしていないコンピューターでこのサンプルを実行すると、エラーが発生します。

ワークグループに参加しているコンピューター、または Active Directory 統合がないコンピューターでサンプルを実行するには

  1. コンピューターがドメインの一部ではない場合、または Active Directory 統合がインストールされていない場合は、次のサンプル構成コードに示すように、認証モードと保護レベルを None に設定してトランスポート セキュリティをオフにします。

    <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. サンプルを実行する前に、サーバーとクライアントの両方で構成を変更してください。

    security modeNone に設定することは、MsmqAuthenticationModeMsmqProtectionLevelMessageセキュリティをNoneに設定することと同じです。