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
サンプルを設定、ビルド、実行するには
Windows Communication Foundation サンプル のOne-Time セットアップ手順を実行していることを確認します。
ソリューションの C# または Visual Basic .NET エディションをビルドするには、「Windows Communication Foundation サンプルのビルド」の手順に従います。
単一または複数のコンピューター間の構成でサンプルを実行するには、「Windows Communication Foundation Samplesの実行」の手順に従います。
既定では、 NetMsmqBindingではトランスポート セキュリティが有効になっています。 MSMQ トランスポート セキュリティには 2 つの関連プロパティがあります。 MsmqAuthenticationMode と MsmqProtectionLevel.
既定では、認証モードは Windows
に設定され、保護レベルは Sign
に設定されます。 MSMQ で認証と署名機能を提供するには、ドメインの一部である必要があり、MSMQ の Active Directory 統合オプションをインストールする必要があります。 これらの条件を満たしていないコンピューターでこのサンプルを実行すると、エラーが発生します。
ワークグループに参加しているコンピューター、または Active Directory 統合がないコンピューターでサンプルを実行するには
コンピューターがドメインの一部ではない場合、または 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>
サンプルを実行する前に、サーバーとクライアントの両方で構成を変更してください。
注
security mode
をNone
に設定することは、MsmqAuthenticationMode、MsmqProtectionLevel、Message
セキュリティをNone
に設定することと同じです。