2

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 型をシリアル化できるようにする必要があるためです。

4

3 に答える 3

1

ここで最初に確認することは、WCF サービスの権限です。メッセージ キューへの接続が、メッセージ キューへの接続を許可されているアカウントによって行われているかどうか。

構成エラーが原因である可能性もあります。接続構成は正しいですか?

イベント ログを確認してください。エラーが発生している可能性があり、正しい方向に進むことができます。

于 2009-12-28T12:15:02.013 に答える
1

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 は、.svclog ファイルを読み取るためのサービス トレース ビューアー ツールを提供しています。

のパスがinitializeDataサービスによって書き込み可能であることを確認してください。

于 2009-12-28T13:43:42.457 に答える
1

メッセージが実際に WCF サービスによってキューに残されているかどうか、またはメッセージが取得されて削除され、WCF によって処理されていないかどうかを確認しましたか?

ServiceHost インスタンスのUnknownMessageReceivedイベントにハンドラーをアタッチし、メッセージが取得されたときにトリガーされているかどうかを確認します...これは、サービス コントラクトが正しく定義されていないことを示しています (それはあなたかもしれません)。キャッチオールを使用する必要があります:

[OperationContract(Action="*")]

メソッドに正しくルーティングされるようにするため。

于 2009-12-28T13:23:11.343 に答える