パイプライン コンポーネントのスキーマ解決
パイプラインの逆アセンブラー コンポーネントおよびアセンブラー コンポーネントは、XSD スキーマを使用して、メッセージを処理します。 スキーマには、昇格させたプロパティの一覧、識別フィールド、フラット ファイル メッセージの注釈、XML エンベロープの注釈などの情報が含まれます。
標準の逆アセンブラー コンポーネントおよびアセンブラー コンポーネントは、スキーマの種類名およびメッセージの種類を使用して、展開されたスキーマの取得をサポートします。 一部のコンポーネントは、スキーマの種類名とメッセージの種類の両方を使用して、スキーマを取得します。スキーマの種類だけでスキーマを取得するコンポーネント (フラット ファイル逆アセンブラーなど) もあります。
XML メッセージを取得するパイプライン コンポーネントは、メッセージのルート要素および名前空間を調べて、メッセージの種類を判別します。 たとえば、次の XML のメッセージ型は です http://MyDocument.org#MyDocument
。
<ns0:MyDocument xmlns:ns0="http://MyDocument.org">
</ns0:MyDocument>
スキーマに名前空間が定義されていない場合、メッセージの種類は "rootNode>"< になります。 たとえば、前の例の XML で名前空間がない場合、メッセージの種類は、"MyDocument" になります。
標準のパイプライン コンポーネントは、メッセージの種類を使用して、データベースから適切なスキーマを取得します。 既定の XML の受信および送信パイプラインは、メッセージの XML コンテンツから実行時に動的に検出されるメッセージの種類を使用して、読み込むスキーマを常に判別します (認識されないメッセージが許可されるように、パイプライン コンポーネントが設定されている場合を除く)。 XML 逆アセンブラーでは、このメカニズムを使用して、メッセージのエンベロープを削除できます。ただし、XML アセンブラーは、使用するエンベロープ スキーマを認識しないままで送信メッセージのエンベロープを作成することはできません。
パイプライン デザイナーから、XML アセンブラーの構成プロパティのエンベロープ スキーマを指定します。
スキーマの解決方法
XmlDisassembler で直接スキーマを指定していない場合、スキーマは次の方法で解決されます。
最初に、デプロイされたスキーマの非修飾検索は、ルート ノード名と名前空間 (例:
http://MyNamespace#MyRoot
) を使用して行われます。 一致するものが 1 つだけ見つかった場合、スキーマは解決されます。 一致するものが複数見つかった場合で、バージョン番号のみが異なり 1 つのバージョンのみがアクティブな場合は、そのバージョンが使用され、スキーマは解決されます。 同じスキーマが複数のアプリケーションでアクティブになっている場合は、複数のアクティブなスキーマが検出されます。この場合、次のステップ 2 に進んでさらに検索が行われます。手順 1 で解決できない一致が複数ある場合、検索はパイプラインが実行しているアセンブリによって修飾されます。 パイプラインが実行しているのと同じアセンブリ内で一意のスキーマが見つかった場合、スキーマは解決されます。
一致するスキーマが見つからない場合は、スキーマの解決にパブリッシャーが使用され、 ルート ノード、名前空間、および公開キー トークンを使用して検索が絞り込まれます。 一致するスキーマが 1 つだけ見つかった場合、スキーマは解決されます。
スキーマを解決できない場合は、 一意のスキーマが見つからないというエラーが返されます。
SQL Server照合順序と大文字と小文字の区別がスキーマ解決に及ぼす影響など、その他の考慮事項については、「名前空間の管理」を参照してください。
XML アセンブラーのエンベロープまたはフラット ファイル アセンブラーのヘッダーおよびトレーラーを作成するには、次のいずれかの操作を行います。
カスタムの送信パイプラインを作成し、XML アセンブラーの構成プロパティのエンベロープ スキーマを指定します。 この操作はパイプライン デザイナーで行います。
BizTalk Server 管理コンソールで、送信ポートの送信パイプラインのプロパティに XMLTransmit を指定します。 省略記号をクリックし、パイプラインのプロパティを構成します。次に、EnvelopeDocSpecNames プロパティのエンベロープ スキーマを指定します。
同じスキーマの複数のバージョンがデータベースに意図的に (または誤って) 展開されている場合 (並列配置や複数のシナリオが固有のメッセージの種類を使用している場合など)、メッセージの種類によるスキーマ解決が機能しないことがあります。 メッセージの種類によるスキーマ解決に失敗した場合、"スキーマがあいまい" であることを示すエラーがイベント ログに追加されます。 メッセージの種類によるスキーマ解決が成功したかを確認するには、次のいずれかの操作を行います。
カスタム パイプラインと同じ BizTalk プロジェクトのスキーマを定義します。
パイプラインを含むアセンブリと同じキーを持つスキーマのアセンブリに署名します。
パイプライン コンポーネントのスキーマを明示的に指定します (メッセージの種類の名前は、BizTalk 管理データベースで固有にする必要があります)。
重要
同じアセンブリ内のスキーマでメッセージの種類を共有する場合、同一のパイプライン コンポーネント アセンブリ内にこれらのスキーマを含めないでください。これは、あいまい解決の制限があるためです。代わりに、パイプライン コンポーネント アセンブリの外部のスキーマを参照してください。 スキーマおよびパイプライン コンポーネントが同じアセンブリにある場合、スキーマの種類名がカスタム パイプラインのパイプライン コンポーネントで明示的に指定されていても、あいまい解決は機能しません。
Note
IPipelineContext を使用してデプロイされたスキーマを取得するカスタム パイプライン コンポーネントでは、実行時にコンポーネントにスキーマの種類名が指定されていない場合にのみスキーマの種類別にスキーマを取得し、コンポーネントの実行時にスキーマの種類情報が使用できない場合にのみメッセージの種類でスキーマを取得する必要があります。