VS2012 をインストールした後、何年も意味のある変更が加えられていない古いアプリを使用しようとすると、MSMQ メッセージが失われていました。
調査の結果、それらはターゲット サーバーで処理されていたことが判明しましたが、応答キューが正しくなかったため、正しく返されませんでした。コンストラクターに渡された DIRECT:OS: 形式ではなく、PRIVATE: 形式を使用していました。
具体的には、これが実行されます。
Dim lobj_Queue As New MessageQueue("FormatName:DIRECT=OS:" & astrServer & "\" & astrQueue)
ここastrServer
で、 はローカル マシンastrQueue
の名前で、 は応答を配置する応答キューの名前です。
キューの結果の形式名は、"PRIVATE=d69f93e2-18f1-42eb-a468-84ca521efb5b\00000298"
フォレスト間のアクティビティに変換できません。
.net Framework 3.5 用にビルドされた同じアプリを実行すると、正しく動作しました。
.net 4.5 はキュー形式を自動的に解決しようとするようです。http://connect.microsoft.com/VisualStudio/feedback/details/762194/accessing-messagequeue-formatname-throws-an-exception-on-queues-returned-by-getprivatequeuesbymachine-remotemachine-on-によると、ある時点でa-workgroup-computer#detailsこの動作により例外が発生しました。
プロパティのソースをデバッグすると、MessageQueue.FormatName
現在、スローされた例外が処理され、キュー パスを解析する以前の方法にフォールバックすることが示されます。これにより、ターゲット サーバーに対して初めて有効なキュー パスが生成されるため、メッセージはサーバーに到達して処理されますが、ローカル マシンで応答キューを生成すると、呼び出しは成功し、ターゲットには理解できない形式名が生成されます。そのため、サーバーの応答は受信されず、発信キューに永久に残ります。
この作業を継続する方法はありますか? 私の知る限り、ローカルで生成した名前は同じフォレストでしか理解できないため、プライベート応答キューを使用する方法はありません。
この特定のシナリオに対する回答がまったくないことを考えると、これを行うための明らかな解決策があることを願っています。