MSMQ を使用する送信ポートを持つ BizTalk 2006 アプリがあります。
また、いくつかのWCFサービスを備えたWCF winformsホスティングアプリもあります(開発環境では、運用環境ではホスティングとしてWindowsサービスを使用しています)。
私が作成した WCF サービスの 1 つに MSMQIntegrationBinding があります (BizTalk は WCF サービスではないため、NetMSMQBinding は使用できません)。
ジャーナル オプションを有効にしたため、メッセージがリモート キューに正しく配置されていることがわかります。ジャーナル キューにメッセージが表示されますが、キューが空で、WCF サービスがメッセージを取得していません。
この問題を解決するためにどこを見ればいいのか、誰かに手がかりを教えてもらえますか?
(編集1):このトピックについてさらに調査を行いました:
- MSMQ を使用して BizTalk 2006 R2 と通信する場合は、MSMQIntegrationBinding を使用する必要があります。これは、NetMSMQBinding が WCF-to-WCF 専用であるためです。
- だから私はMSMQIntegrationBindingに固執しています
- MSMQIntegration バインディングは DataContract シリアライザーを使用しません。代わりに、MsmqMessageSerializationFormat プロパティに基づいてデータをシリアル化します。そのデフォルト値は MsmqMessageSerializationFormat.Xml で、これは XmlSerializer が使用されることを意味します。この背後にある理論的根拠は、msmq 統合トランスポートがネイティブ MSMQ / System.Messaging アプリケーションと相互運用するように特別に設計されていることです。
- MSMQIntegration バインディングは単純な古い XmlSerializer を使用するため、svcutil.exe を使用してデータ クラスを生成する簡単な機能はありません。だから私は手動でデータコントラクトクラスを作成する必要があります....pffffffffffff
(参照: http://social.msdn.microsoft.com/Forums/en/wcf/thread/2d48fe90-5c2a-4156-8a3f-2e21d5638fa1およびhttp://www.danrigsby.com/blog/index.php/2008 /03/07/xmlserializer-vs-datacontractserializer-serialization-in-wcf/ )
(編集2):
WCF サービスからの診断トレース データを確認したところ、逆シリアル化例外が原因でメッセージが削除されました。唯一の解決策は、手動で datacontract クラスを作成することです...
(編集 3): svcutil.exe の代わりに xsd.exe ツールを使用して datacontract クラスを作成したため、ここでは手作りの作業はありません ;-) したがって、結論は、パラメーターとして使用されるデータ コントラクト クラスに xsd.exe を使用することです。 WCF サービス メソッドで。これは、MSMQIntegrationBinding により、既定の DataContractSerializer ではなく XMLSerializer を使用して、すべての datacontract 型をシリアル化できるようにする必要があるためです。