4

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現在、スローされた例外が処理され、キュー パスを解析する以前の方法にフォールバックすることが示されます。これにより、ターゲット サーバーに対して初めて有効なキュー パスが生成されるため、メッセージはサーバーに到達して処理されますが、ローカル マシンで応答キューを生成すると、呼び出しは成功し、ターゲットには理解できない形式名が生成されます。そのため、サーバーの応答は受信されず、発信キューに永久に残ります。

この作業を継続する方法はありますか? 私の知る限り、ローカルで生成した名前は同じフォレストでしか理解できないため、プライベート応答キューを使用する方法はありません。

この特定のシナリオに対する回答がまったくないことを考えると、これを行うための明らかな解決策があることを願っています。

4

1 に答える 1

3

しばらく非効率的な回避策に取り組んだ後、同僚の 1 人が問題の修正を見つけました。

クライアント コンピューターで、およびDirectory Services Integrationの下にある機能をアンインストールする必要があります。Message QueuingMessage Queuing Services

その後、リクエストは送信者に正しくルーティングされます。この機能が .NET 4.5 によって自動的に追加されたのか、それとも単に変更されたのかはわかりませんが、無効にするとすぐに問題が解決しました (実行中の Web アプリケーションは再起動さえしませんでした - 次の要求は機能しました)。

于 2013-04-09T20:02:39.377 に答える