3

.Net Framework 4.0 を使用して、WCF セルフ ホスト サービスを開発しました。

[ServiceContract(SessionMode=SessionMode.Required)]
[ServiceKnownType(typeof(XmlDocument))]
public interface IMyMSMQ
{
    [OperationContract(IsOneWay=true, Action="*")]
    void OnMessageReceived(MsmqMessage<XmlDocument> msg);
}

このインターフェースの私のクラスの実装は次のようになります。

public class MyMSMQ : IMyMSMQ, IErrorHandler 
{
    public void OnMessageReceived(MsmqMessage<XmlDocument> msg)
    {
      // Log Message To appropriate destination
      Logger.LogMessage(msg);
    }
}

複数のシナリオを試しました。

シナリオ 1:

  1. サービスを開始します。
  2. クライアント アプリを起動します。
  3. クライアント アプリを使用してキューにメッセージを送信する
  4. サービスが既にメッセージを読み取っているため、キューにメッセージが取り込まれていないように見えることに注意してください。
  5. サービスでは他に何も起こらないことに注意してください。
  6. もう1通メッセージを送る
  7. メッセージがキューに残っていることに注意してください

シナリオ # 2: これはシナリオ 1 に似ていますが、アプリの開始順序が異なります

  1. クライアント アプリを起動します。
  2. クライアント アプリを使用してキューにメッセージを送信する
  3. サービスが開始されておらず、メッセージを読んでいないため、キューにメッセージが入力されているように見えることに注意してください。
  4. サービスを開始します。
  5. メッセージが消えることに注意してください。
  6. サービスでは他に何も起こらないことに注意してください。
  7. もう1通メッセージを送る
  8. メッセージがキューに残っていることに注意してください

サービスが開始されるたびに、メッセージがキューから削除されるため、サービスが実際にメッセージを読み取っているように見えますが、メッセージを読み取ると、どこに送信するか、または何をすべきかを理解できません。

4

1 に答える 1

1

WCF ライブラリのコードに問題がないことがわかりました。これが、エンドポイント バインディングを定義する方法でした。

            MsmqIntegrationBinding binding = new MsmqIntegrationBinding(MsmqIntegrationSecurityMode.None);
            binding.ReceiveTimeout = new TimeSpan(0, 1, 0);  // set timeout to 1 minute.
            binding.ReceiveErrorHandling = ReceiveErrorHandling.Fault;

            this.AddServiceEndpoint(typeof(eRxMsmqWCF.IeRxMSMQ), binding, GetMQUri());

(これMsmqIntegrationBindingには、次の using ステートメントを含める必要があります: using System.ServiceModel.MsmqIntegration;.

時々、私はインテリセンスに頼りすぎています。は、他のバインディングが配置MsmqIntegrationBindingされている標準には存在しません。System.ServiceModelそこで、NetMsmqBinding代わりに を使用しました。

于 2012-10-29T12:19:34.663 に答える