12

Windows サービスとしてホストされ、MSMQ エンドポイントを公開する WCF サービスを開発しました。

SERVER1 にクライアント アプリがあり、SERVER2 に MSMQ と WCF サービスがあります。

SERVER1/ClientApp がメッセージを SERVER2 MSMQ にプッシュしようとすると、次のエラーが発生します。

    System.TypeInitializationException: The type initializer for 'System.ServiceModel.Channels.Msmq' threw an exception. ---> System.DllNotFoundException: Unable to load DLL 'mqrt.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
       at System.ServiceModel.Channels.UnsafeNativeMethods.MQGetPrivateComputerInformation(String computerName, IntPtr properties)
       at System.ServiceModel.Channels.MsmqQueue.GetMsmqInformation(Version& version, Boolean& activeDirectoryEnabled)
       at System.ServiceModel.Channels.Msmq..cctor()
       --- End of inner exception stack trace ---
       at System.ServiceModel.Channels.Msmq.EnterXPSendLock(Boolean& lockHeld, ProtectionLevel protectionLevel)
       at System.ServiceModel.Channels.MsmqOutputChannel.OnSend(Message message, TimeSpan timeout)
       at System.ServiceModel.Channels.OutputChannel.Send(Message message, TimeSpan timeout)
       at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
       at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
       at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [7]: 
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   at FacilityManager.Service.NotificationsProcessorServiceReference.INotificationsProcessor.SendNewReactiveTaskNotifications(NewReactiveTaskDataContract newReactiveTaskDataContract)

SERVER1 と SERVER2 はどちらも Windows Server 2008 R2 Enterprise (6.1 SP1) を実行しており、サーバー マネージャーの [機能の追加] を介して MSMQ がインストールされています。

DLL が欠落していることは理解していますが (エラーからも明らかです!)、DLL をあるべき場所に取得するために何をインストールすればよいかわかりません。

Windows エクスプローラーで検索すると、両方のサーバーの次のディレクトリに DLL が存在することがわかります。

  • C:\Windows\System32
  • C:\Windows\SysWOW64
  • C:\Windows\winsxs\x86_microsoft-windows-msmq-runtime-core_31bf3856ad364e35_6.1.7601.17514_none_5768e2ad17453bd6
  • C:\Windows\winsxs\amd64_microsoft-windows-msmq-runtime-core_31bf3856ad364e35_6.1.7601.17514_none_b3877e30cfa2ad0c

どんな助けでも感謝します。

4

3 に答える 3

24

明らかな余談です。Windows 機能 -> Microsoft Message Queue (MSMQ) サーバーがインストールされていない場合、このエラーが発生します。[プログラムと機能] に移動し、[Windows の機能を有効または無効にする] に移動します。

于 2014-11-02T22:28:35.577 に答える
5

私は賢明ではありませんが、物事は今うまくいっています。

SOとGoogleで何時間も過ごした後、ここから取得したコードを使用して簡単なコンソールアプリケーションを作成することにより、MSMQが両方のサーバーにインストールされていることを確認するだけになりました...

https://stackoverflow.com/a/16104212/192999

Server1 と Server2 の両方でコンソール アプリを実行したところ、どちらも IsMsmqInstalled に True という結果が返されました。

その後、アプリケーションを実行すると、「DLL 'mqrt.dll' をロードできません」というエラーが発生しなくなりました。

への呼び出しがDLLを登録したのかどうかはわかりませんがNativeMethods.LoadLibrary("Mqrt.dll");、問題は確かに修正されました。

これが将来誰かに役立つことを願っています!

于 2013-09-03T13:56:45.007 に答える
1

これは、MSMQ が自身の初期化を完了する前に、SERVER2 上のサービスが初期化を開始して完了することが原因である可能性があります。これをテストする最も簡単な方法は、WCF MSMQ エンドポイントをホストしているサービスを再起動することです。WCF サービスが IIS でホストされている場合、アプリ プールをバウンスしても同じことが起こる可能性がありますが、確かなことはわかりません。IIS でホストされる MSMQ エンドポイントを扱ったことはありません。

サービスを再起動すると問題が解決し、独自のサービスが Windows サービスである場合は、MSMQ を依存関係として独自のサービスに追加して、MSMQ の準備ができるまで起動を遅らせることができます。 サーバー障害に関するこの回答では、その方法について説明しています。ちなみに頼りたいサービスは「Message Queueing」というサービスです

于 2014-10-10T14:16:59.717 に答える