msmqintegrationbindingを備えたWCFは、キューからメッセージを選択しません
-
21-09-2019 - |
質問
MSMQを使用して送信ポートを備えたBizTalk 2006アプリがあります。
また、いくつかのWCFサービスを備えたWCF WinFormsホスティングアプリもあります(開発環境では、生産ではWindowsサービスをホスティングとして使用します)。
私が作成したWCFサービスの1つには、MSMQintegrationバインディングがあります(BizTalkはWCFサービスではないため、NetMSMQBindingは不可能です)。
ジャーナルオプションをアクティブにしてジャーナルキューにメッセージが表示されているため、メッセージがリモートキューに正しく配置されていることがわかりますが、キューは空で、WCFサービスがメッセージを受け取っていません。
誰かが私にこの問題を解決するためにどこを見るべきかを教えてもらえますか?
(編集1):このトピックについてさらに調査しました。
- NetMSMQBindingはWCF-to-WCF専用であるため、MSMQとBizTalk 2006 R2と通信する場合、MSMQintegrationBindingを使用する必要があります。
- だから私はmsmqintegrationbindingに刺されています
- MSMQintegrationバインディングは、DataContract Serializerを使用していません。代わりに、MSMQMessagesErializationFormatプロパティに基づいてデータをシリアル化します。そのデフォルト値はMSMQMessagesErializationFormat.xmlです。これは、XmlSerializerが使用されることを意味します。これの背後にある理論的根拠は、MSMQ統合トランスポートがネイティブMSMQ / System.messagingアプリケーションと相互作用するように特別に設計されていることです。
- MSMQintegrationバインディングはプレーンな古いXmlSerializerを使用しているため、SVCutil.exeを使用してデータクラスを生成する簡単な能力はありません。だから私は私のDataContractクラスを手で作成する必要があります.... pfffffffffff
(参照: http://social.msdn.microsoft.com/forums/en/wcf/thread/2d48fe90-5c2a-4156-8a3f-2-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サービス方法。これは、MSMQintegrationバインディングにより、デフォルトのDataContractSerializerの代わりにXMLSerializerを使用してすべてのデータコントラクトタイプを作成できるようにするためです。
解決
WCFトレースを有効にしてみてください。
何が起こっているのか、何が起こっていないのかを理解するのに役立つかもしれません。
以下は次のとおりです .config
トレースを有効にする例。確認してください .config
ファイルは、WCFサービスホストの同じフォルダーにあります。
<configuration>
<system.diagnostics>
<sources>
<source name="System.ServiceModel" switchValue="Warning"
propagateActivity="true" >
<listeners>
<add name="xml"/>
</listeners>
</source>
<source name="myUserTraceSource" switchValue="Warning, ActivityTracing">
<listeners>
<add name="xml"/>
</listeners>
</source>
</sources>
<sharedListeners>
<add name="xml"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData="C:\trace_logs\TraceLog.svclog" />
</sharedListeners>
</system.diagnostics>
</configuration>
Microsoftはaを提供します サービストレースビューアーツール .svclogファイルを読み取ります。
パスがあることを確認してください initializeData
あなたのサービスによって書くことができます。
他のヒント
ここで最初に確認するのは、WCFサービスの権利です。メッセージキューに接続することが許可されているアカウントによって行われているメッセージキューへの接続です。
また、構成エラーが原因である可能性がありますが、接続構成は正しいですか?
イベントログを確認してください。そこにエラーが発生する可能性があります。これにより、正しい方向に向けられます。
メッセージが実際にWCFサービスによってキューに残されているかどうか、またはWCFによって削除されて削除され、処理されていないかどうかを確認しましたか?
私が試してみることは、ハンドラーをに取り付けることです 未知のmessagereceived ServiceHostインスタンスでイベントと、メッセージが選択されているときにトリガーされているかどうかを確認します...それはあなたのサービス契約が誤って定義されている確かな兆候です(あなたはすべてを使用する必要があるかもしれません:すべて:すべてを使用する必要があります:
[OperationContract(Action="*")]
メソッドに正しくルーティングされるようにします。