エクスポート (0) 印刷
すべて展開

NetMessagingBinding

更新日: 2014年3月

Service Bus の仲介型メッセージングでは、WCF プログラミング モデルがサポートされます。また、WCF 対応アプリケーションでキュー、トピック、およびサブスクリプションを介したメッセージの送受信に使用できる NetMessagingBinding という新しいバインドが用意されています。NetMessagingBinding は、WCF と完全に統合されるキューおよびトピック用の新しいバインドの名前です。機能的には、NetMessagingBindingNetMsmqBinding に似ています。NetMsmqBinding は、メッセージ キュー (MSMQ) をトランスポートとして使用してキュー処理をサポートし、疎結合アプリケーションのサポートを有効にするバインドです。サービス側に対しては、NetMessagingBinding は、キューまたはサブスクリプションからメッセージをプルする自動メッセージ ポンプを提供します。これは、WCF の ReceiveContext メカニズムと統合されます。

この新しいバインドでは、標準のインターフェイスの IInputChannelIOutputChannel、および IInputSessionChannel がサポートされます。アプリケーションで WCF と NetMessagingBinding を使用してキューまたはトピックにメッセージを送信する場合、メッセージは SOAP エンベロープにラップされてエンコードされます。BrokeredMessage 固有のプロパティを設定するには、次の例のように、BrokeredMessageProperty オブジェクトを作成してそのプロパティを設定し、WCF メッセージの Properties コレクションに追加する必要があります。NetMessagingBinding を使用してキューまたはトピックにメッセージを書き込むときは、ServiceBusOutputChannel 内部クラスで WCF メッセージの Properties コレクションから BrokeredMessageProperty プロパティが探され、作成する BrokeredMessage オブジェクトにすべてのプロパティがコピーされます。その後、WCF メッセージから BrokeredMessage オブジェクトにペイロードがコピーされ、最後に、生成されたメッセージがターゲットのキューまたはトピックにパブリッシュされます。

static void Main(string[] args)
{
    try
    {
        // Create the 
        var channelFactory = new ChannelFactory<IOrderService>("orderEndpoint");
        var clientChannel = channelFactory.CreateChannel();
        
        // Create a order object
        var order = new Order()
                        {
                            ItemId = "001",
                            Quantity = 10
                        };

        // Use the OperationContextScope to create a block within which to access the current OperationScope
        using (var scope = new OperationContextScope((IContextChannel)clientChannel))
        {
            // Create a new BrokeredMessageProperty object
            var property = new BrokeredMessageProperty();

            // Use the BrokeredMessageProperty object to set the BrokeredMessage properties
            property.Label = "OrderItem";
            property.MessageId = Guid.NewGuid().ToString();
            property.ReplyTo = "sb://acme.servicebus.windows.net/invoicequeue";

            // Use the BrokeredMessageProperty object to define application-specific properties
            property.Properties.Add("ShipCountry", "Italy");
            property.Properties.Add("ShipCity", "Milan");

            // Add BrokeredMessageProperty to the OutgoingMessageProperties bag provided 
            // by the current Operation Context 
            OperationContext.Current.OutgoingMessageProperties.Add(BrokeredMessageProperty.Name, property);
            clientChannel.SendOrder(order);
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

同様に、NetMessagingBinding ベースのサービスのエンドポイントを使用してキューまたはトピックからメッセージを受信するときは、次の例のように、着信 WCF メッセージの Properties コレクションから BrokeredMessageProperty オブジェクトを取得できます。具体的には、サービス エンドポイントがメッセージを受信すると、ServiceBusInputChannel および ServiceBusInputSessionChannel 内部クラスは新しい WCF メッセージを作成し、受信した本文のペイロードを新しく作成した WCF メッセージの本文にコピーします (ServiceBusInputSessionChannel は、セッションフルなキューとサブスクリプションからメッセージを受信するために使用します)。その後、受信 BrokeredMessage から BrokeredMessageProperty クラスの新しいインスタンスにプロパティがコピーされ、最後に、着信 WCF メッセージの Properties コレクションに新しい BrokeredMessageProperty オブジェクトが追加されます。

[ServiceBehavior]
public class OrderService : IOrderService
{
    [OperationBehavior]
    public void ReceiveOrder(Order order)
    {
        // Get the BrokeredMessageProperty from the current OperationContext
        var incomingProperties = OperationContext.Current.IncomingMessageProperties;
        var property = incomingProperties[BrokeredMessageProperty.Name] as BrokeredMessageProperty;

        ...
    }
}

Service Bus では IInputSessionChannel はサポートされないため、セッション対応キューにメッセージを送信するアプリケーションでは、SessionMode プロパティが SessionMode.Required 以外のサービス コントラクトを使用する必要があります。ただし、Service Bus の WCF ランタイムでは IInputSessionChannel がサポートされるため、WCF と NetMessagingBinding を使用してセッションフルなキューまたはサブスクリプションからメッセージを受信するには、セッション対応サービス コントラクトを実装する必要があります。次のコードは、セッションフルなキューまたはサブスクリプションからメッセージを受信する WCF サービスの例を示しています。

// ServiceBus does not support IOutputSessionChannel.
// All senders sending messages to sessionful queue must use a contract which does not enforce SessionMode.Required.
// Sessionful messages are sent by setting the SessionId property of the BrokeredMessageProperty object.
[ServiceContract]
public interface IOrderService
{
    [OperationContract(IsOneWay = true)]
    [ReceiveContextEnabled(ManualControl = true)]
    void ReceiveOrder(Order order);
}

// ServiceBus supports both IInputChannel and IInputSessionChannel. 
// A sessionful service listening to a sessionful queue must have SessionMode.Required in its contract.
[ServiceContract(SessionMode = SessionMode.Required)]
public interface IOrderServiceSessionful : IOrderService
{
}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Single)]
public class OrderService : IOrderServiceSessionful
{
    [OperationBehavior]
    public void ReceiveOrder(Order order)
    {
        // Get the BrokeredMessageProperty from the current OperationContext
        var incomingProperties = OperationContext.Current.IncomingMessageProperties;
        var property = incomingProperties[BrokeredMessageProperty.Name] as BrokeredMessageProperty;

        ...

        //Complete the Message
        ReceiveContext receiveContext;
        if (ReceiveContext.TryGet(incomingProperties, out receiveContext))
        {
            receiveContext.Complete(TimeSpan.FromSeconds(10.0d));
            ...
        }
        else
        {
            throw new InvalidOperationException("...");
        }
    }
}

この例では、ReceiveContextEnabled 操作の属性の ManualControl プロパティが true に設定されています。この設定によって、サービスから明示的に ReceiveContext.Complete メソッドを呼び出して受信操作をコミットするようになります。実際、ManualControl プロパティが true に設定されている場合、チャネルから受信するメッセージはロックが適用された状態でサービス操作に配信されます。サービスの実装時には、メッセージの受信が完了したことを示す信号を発信するために、Complete(TimeSpan) または Abandon(TimeSpan) を呼び出す必要があります。これらのいずれかのメソッドの呼び出さないと、ロックがタイムアウトするまでメッセージのロックが保持されます。ロックが解除されると (Abandon(TimeSpan) を呼び出すかロックがタイムアウトすると)、メッセージがチャネルからサービスに再度ディスパッチされます。Complete(TimeSpan) を呼び出した場合は、メッセージの受信が正常に完了したことを示すマークが付けられます。

また、OrderService クラスで、ServiceBehavior.InstanceContextMode プロパティが InstanceContextMode.PerSession に設定され、ConcurrencyMode プロパティが ConcurrencyMode.Single に設定されています。以上の手順で、指定したキューまたはサブスクリプションで新しいセッションを使用できるようになるたびに、ServiceHost で新しいサービス インスタンスが作成されます。また、ServiceHost では、1 つのスレッドで、キューまたはサブスクリプションから連続してメッセージを受信します。NetMessagingBindingSessionIdleTimeout プロパティは、サービスの有効期間を制御します。セッションフル キューを介して WCF 交換メッセージを使用する方法の詳細については、Windows Azure AppFabric SDK V1.5 に含まれる WcfServiceSessionSample サンプルを確認することを強くお勧めします。

コミュニティの追加

表示:
© 2014 Microsoft