2

2 つの類似した WCF サービスが実行されている 2 つの異なるサーバーがあります。両方のサービスはまったく同じです (クローン)。両方のサービスを相互に通信する必要があるため、1 つのオーケストレーションで両方のサービスを使用する必要があります。(「生成されたアイテムの追加」を使用してサービス参照を追加しています)。「Get」という名前の 1 つのサービス メソッドからデータを取得し、それを他の「Send」メソッドに送信したいと考えています。プロジェクトを展開した後、エラーが発生し"Cannot locate document specification because multiple schemas matched the message type #####"ます。

特定のドキュメント スキーマを使用してカスタム パイプラインを作成するソリューションを読みましたが、うまくいきませんでした。

どうすればこの状況に対処できますか?

4

3 に答える 3

1

問題は、同じ名前空間とルート要素を持つ BizTalk アプリケーションに複数のスキーマがあることです。

"get service" と"send service" のDocumentSpecNames両方でプロパティを設定して、どちらを使用するかを BizTalk に伝える必要があります。XMLReceivePipelineXMLTransmitPipeline

この値の基本的な形式は...Schemaname+Rootname,Assembly

例:

Company.Schemas.Messages+GetReply,Company.Schemas, 
   Version=1.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
于 2013-01-30T10:55:54.893 に答える
1

サービスが本当に同一である場合は、ウィザードを使用してスキーマを 2 回インポートする必要はありません。最初のサービスの WSDL をインポートしてスキーマとポートの種類を作成し、新しい送信ポートを作成して*、それに応じてバインディングを変更します。 2 番目のサービス (つまり、特にサービス URL) を指すようにします。

この状況は通常、WCF サービスが を使用MessageContractsして、複数のサービス呼び出しに対して同じメッセージ ペイロードを受け入れるか返す場合にも発生します (DataContract通常、フォームの「一意の」ルート要素名を取得する必要があるxmlns#MyMethodおよび とは対照的ですxmlns#MyMethodResponse)。

この場合 (つまり common MessageContracts)、basvo の回答に加えて、次のようにしてこの問題を回避することもできます。

  1. 消費されるすべての WCF サービスのすべてのアーティファクトを Visual Studio の BTS プロジェクトにインポートします。
  2. 各要求 (または応答スキーマ) の最初の「インスタンス」を保持し、VS のオーケストレーション ビューで、2 番目以降の各ポート タイプを調べて、ポート上の重複した要求または応答メッセージ (「操作メッセージ」) を削除します。タイプ。(各ポート タイプの下に、要求、応答、および障害メッセージ タイプが表示されます)
  3. 次に、削除した各メッセージ タイプを「編集」し、手動で行って、保持しているスキーマの元のインスタンスに変更する必要があります。
  4. また、インポートされたファイルから重複したメッセージ タイプを削除するか、ハッキングする必要がある場合もあり.xsdます。

ただし、Web サービスが変更され、インポートされたスキーマを再度「更新」する必要がある場合、これは面倒です。インポート ウィザードが重複したスキーマを検出し、この方法でそれらをマージするように提案された場合、これは便利な機能です。

* 更新- 明確にするために、orch 設計で同じ論理送信ポートを再利用しますが、展開された BTS サーバー/クラスターに新しい送信ポートを作成し、必要なメッセージに送信ポートをサブスクライブし、2 番目の Orch を送信ポートにリンクします (直接バインディングを使用しているかどうかに応じて)、明らかにバインディングを 2 番目の URL に変更します。

于 2013-01-30T12:20:50.387 に答える
0

これらのサービスは同じであるため、これらのいずれかのサービス参照を追加するだけで、必要なスキーマが追加されます。BizTalk MMC でサービスごとに個別の送信ポートを作成し、オーケストレーションの構成中にオーケストレーションで作成された論理ポートを正しい送信ポートに接続するだけです。

この解決策はうまくいきました.....

于 2013-01-31T05:58:42.933 に答える