4

2 台の Windows Server 2008 R2 仮想マシンで MSMQ 5 を動作させようとしています。ローカルおよびリモートのプライベート キューに送信でき、ローカルのプライベート キューから読み取ることができます。リモート専用キューから読み取ることができません。

私は多くの提案を読みましたが、特に John Breakwell がMSMQ Issue reading remote private queues (again)でまとめたものを読みました。

私がすでに行ったこと:

  • 両方のマシンでファイアウォールをオフにしました。
  • Everyone と AnonymousLogon がキューを完全に制御できるようにしました。(AnonymousLogon アクセスを奪うと、リモートでキューに送信できなくなり、メッセージは受信側のマシンで「アクセスが拒否されました」と表示されます。)
  • 両方のマシンで認証されていない Rpc を許可します。
  • 両方のマシンで NewRemoteReadServerAllowNoneSecurityClient を許可しました。

送信コード フラグメントは次のとおりです。

        MessageQueue queue = new MessageQueue(queueName, false, false, QueueAccessMode.Send);
        Message msg = new Message("Blah");
        msg.UseDeadLetterQueue = true;
        msg.UseJournalQueue = true;
        queue.Send(msg, MessageQueueTransactionType.Automatic);
        queue.Close();

受信コード フラグメントは次のとおりです。

   queueName = String.Format("FormatName:DIRECT=OS:{0}\\private$\\{1}",host,id);
   queue = new MessageQueue(queueName, QueueAccessMode.Receive);
   queue.ReceiveCompleted += new ReceiveCompletedEventHandler(receive);
   queue.BeginReceive();

...

    public void receive(object sender, ReceiveCompletedEventArgs e)
    {
        queue.EndReceive(e.AsyncResult);
        Console.WriteLine("Message received");
        queue.BeginReceive();
    }

私の queueName は次のようになりますFormatName:DIRECT=OS:server2\private$\TestQueue

キューで beginReceive() を呼び出すと、

Exception: System.Messaging.MessageQueueException (0x80004005)
   at System.Messaging.MessageQueue.MQCacheableInfo.get_ReadHandle()
   at System.Messaging.MessageQueue.ReceiveAsync(TimeSpan timeout, CursorHandle cursorHandle, Int32 action, AsyncCallback callback, Object stateObject)
   at System.Messaging.MessageQueue.BeginReceive()

Server1 で Wireshark を使用して、ネットワーク トラフィックを調べました。すべての詳細を掲載せずに、次の段階を経ているようです。(Server1 は Server2 のキューから読み取ろうとしています。)

  • Server1 が Server2 に接続し、NTLMSSP チャレンジ/レスポンス ネゴシエーションが行われます。いくつかの応答には、「不明な結果 (3)、理由: ローカル制限を超えました」と記載されています。
  • Server1 は Server2 に rpc__mgmt_inq_princ_name 要求を送信し、Server2 は対応する応答で応答します。
  • ドメインを検索する LDAP 交換がいくつかあり、次に ldap://domain/cn=msmq,CN=Server2,CN=Computers,DC=domain への参照があり、「そのようなオブジェクトはありません」という応答が返されます。
  • 次に、LDAP サーバーとの間で暗号化された SASL GSS-API 交換が行われます。
  • 次に、ldap サーバーと Server2 への接続が閉じられます。

イベント ビューアー > アプリケーションとサービス ログ > Microsoft > Windows > MSMQ > End2End を有効にしようとしました。メッセージが送信されていることは示されていますが、受信しようとして失敗した理由は示されていません。これをさらにデバッグするにはどうすればよいですか?

4

3 に答える 3

4

問題はドメインに関連していました。Server1とServer2は開発ドメインの一部でした。私のログインアカウントは企業ドメインの一部でした。開発ドメインは、ログイン、管理者のメンバー、機能のインストールなどを行うのに十分な企業ドメインを信頼しています。しかし、リモートキューを読み取るには信頼が不十分なようです。

パブリックキューを調べてこれを見つけました。リモートプライベートキューの読み取りに問題がある場合は、パブリックキューを試してより多くのデータを取得する必要があります。適切なディレクトリ統合機能をインストールした後、パブリックキューを作成できましたが、パブリックキューのリストに表示されませんでした。パブリックキューのリストを更新しようとすると、次のエラーが発生しました。

すべてのパブリックキューを表示できるわけではありません。ローカルにキャッシュされたパブリックキューのみを表示できます。エラー:オブジェクトがActiveDirectoryで見つかりませんでした。

Googleは、ここで同様の問題に対するJohn Breakwellの回答を指摘しました。これは、信頼関係がメッセージングプロトコル間で機能しないことを示しています。

于 2012-05-22T23:56:01.150 に答える
1

BeginReceiveはトランザクション キューからの受信をサポートしていないように見えるため、代わりに標準のReceiveメソッドを使用し、トランザクション タイプを指定してみてください。

Message msg = queue.Receive(MessageQueueTransactionType.Automatic);

MSMQ は常に論理エラー メッセージを返すとは限りません...

于 2012-05-22T12:28:07.587 に答える
0

System.Messaging.MessageQueue.MQCacheableInfo.get_ReadHandle() での System.Messaging.MessageQueueException (0x80004005)

このエラーは、存在しないキューに対する BeginReceive Read が原因で発生することもあります。設定をチェックして、指定されたキュー パスが物理的に存在し、「Everyone」の完全な権限を持っていることを確認します

于 2014-10-22T04:56:50.173 に答える