10

サーバー2008 x64で実行されているnet.msmqを使用するnet 3.5から移植された.net 4.0アプリケーションがあります

設定

  • アドレスが「net.msmq://localhost/private/msmqdataservice.svc」の net.msmq サービス
  • アドレス "net.msmq://localhost/private/msmqdataservice.svc" の net.msmq endpoing
  • MSMQ のキュー -> name = "$private\msmqdataservice.svc"

現在、.net 3.5 を使用して、すべてが本番環境で動作しています。

サーバーに.net 4.0をインストールし、同じボックスにステージングするための新しいサイトを作成しました。

新しいステージング msmq セットアップは

  • アドレスが "net.msmq://localhost/private/staging/msmqdataservice.svc" の net.msmq サービス
  • アドレス "net.msmq://localhost/private/staging/msmqdataservice.svc" の net.msmq endpoing
  • MSMQ のキュー -> name = "$private\staging/msmqdataservice.svc"

別のサイト用に別のキューを作成しました。

私が新しいサイトで行ったもう1つの変更は、これがiisの別のサイトであり、別のIPアドレスでリッスンしていることです。net.msmq を「localhost」にバインドしたままにしました。メイン サイトにも、net.msmq -> 'localhost' に対する同じバインディングがあります。そうあるべきだと思います。異なる構成が必要な場合は指摘してください。

問題は、リクエストがキューに入れられているが、アプリケーションによって取得されず、そこにとどまっていることです

ログに問題の兆候はありません。これに関連してログに表示されているのは、「msmqactivation がキューを検出できません」という警告だけです。この警告は正しく理解できませんでしたが、3.5 の msmq では常に問題なく表示されていたためです。

私が考えることができるものはすべて検証されており、正しいです。

  • アプリケーションのアプリ プールはネットワーク サービスとして実行されており、キューに完全にアクセスできます。
  • net.msmq アクティベーション サービスは、ネットワーク サービスで実行されています
  • 同じ結果でサービスURLの異なる命名規則を試しました

概要

net.msmq を使用した複数のサイトのセットアップに関する洞察を提供してください。両方のサイトで値 = 'localhost' の net.msmq バインディングを使用しています。マシン名のアイデンティティだと思います。

この問題を診断する方法はありますか?

他に考えられることは何でも役立つかもしれません。

100 マンアワーを費やした後、問題が何であるかを理解できないため、昨日のリリースを延期する必要がありました。また、私の開発マシンでそれを壊すことはできません。

編集

問題は、新しいサイトの命名規則を作成した後に機能しないことでした

アドレス "net.msmq://localhost/private/staging/msmqdataservice.svc" を持つ net.msmq サービス net.msmq は、MSMQ のアドレス "net.msmq://localhost/private/staging/msmqdataservice.svc" キューでエンドポイン - > name = "$private\staging/msmqdataservice.svc"

サービス名 net.msmq://localhost/private/msmqdataservice.svc で動作しました

しかし、今ではまったく同じエンドポイントを使用する 2 つのサイトを持つことはできません。

同じマシンで異なるURLと異なるキューを持つ2つの異なるサイトで同じエンドポイントを持つ方法はありますか?

4

5 に答える 5

3

私にとっての修正は、AppFabric for Windows Server v1.1 をインストールすることでした。(WAS/IIS でホストされている WCF サービスまたは WF アプリケーションを使用しているすべてのユーザーにとって必須です。)

これにより、非 WCF キューを作成するたびに WAS プロセスがクラッシュするという問題も修正されました。Just-In-Time デバッガーはこれをスローしていました。

 System.ServiceModel.EndpointNotFoundException was unhandled
      Message=The service '~/nonWcfQueueName' does not exist.
      Source=System.ServiceModel.Activation
      StackTrace:
           at System.ServiceModel.ServiceHostingEnvironment.NormalizeVirtualPath(String virtualPath)
           at System.ServiceModel.Channels.MsmqHostedTransportManager.HostedBindingFilter.MatchFound(String host, String name, Boolean isPrivate)
           at System.ServiceModel.Channels.MsmqBindingMonitor.MatchQueue(MatchState state)
           at System.ServiceModel.Channels.MsmqBindingMonitor.ProcessFoundQueues(MessageQueue[] queues, Dictionary`2 knownQueues, Boolean isPrivate)
           at System.ServiceModel.Channels.MsmqBindingMonitor.OnTimer(Object state)
           at System.Runtime.IOThreadScheduler.ScheduledOverlapped.IOCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
           at System.Runtime.Fx.IOCompletionThunk.UnhandledExceptionFrame(UInt32 error, UInt32 bytesRead, NativeOverlapped* nativeOverlapped)
           at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)
      InnerException: 

同じマシンで WCF キューと非 WCF キューを混在させる必要がある人はあまりいないと思います。これが、私が先週経験した痛みから誰かを救うことを願っています!

于 2012-10-05T19:38:35.853 に答える
0

サービス エンドポイントの URI は、(多かれ少なかれ、http://msdn.microsoft.com/en-us/library/ms789042.aspxを参照) キュー名と一致する必要があります。したがって、ここでの解決策は、staging という名前の仮想ディレクトリを作成し、そこにサービスを配置することです。

バインド情報については、サーバーへの localhost のポイントはキュー リスナーがリッスンする必要があるため、キューが IIS と同じマシンにインストールされている場合、これは実際には localhost である必要があります。

于 2011-08-26T13:54:10.023 に答える
0

別のポートを使用するのはどうですか?同じホスト名を使用して、新しい vdir またはサイトの新しいポートでアクティブ化するよう WAS に指示できます。

于 2010-10-11T16:53:36.573 に答える
0

また興味深い点: net.msmq listner アダプター サービスは、キューにアクセスできなかったという事実をキャッシュしているようです。サービスのキューにアクセスしようとして失敗した場合、net.msmq リスナー アダプターのアクセス許可を追加しても機能しません。サービスを再起動すると、キューが再び監視され始めました。

于 2013-07-03T09:09:38.030 に答える
0

残念ながら、リスナーはサービス名を使用してリッスンするキューを決定するため、受信側のサービスが呼び出された場合

MYOrganisation.Services.MyService.svc

キューを呼び出す必要があります

net.msmq://localhost/MYOrganisation.Services/MyService.svc

したがって、キューは次のように呼び出されます。

MYOrganisation.Services/MyService.svc

これを試して、私に戻ってください。機能する構成の完全な例を投稿できます。

2 つの異なるエンドポイントがなくても、別のキューをリッスンする別の名前空間 (またはサービスの名前を変更するだけ) を持つ同じサービスを持つことができると思います。理想的ではありませんが、うまくいくことがわかったのはこれだけです。

于 2011-06-11T12:39:00.190 に答える