0

私が取り組んでいるこの1つのオーケストレーションでのみ発生した奇妙な状況があります。

受信メッセージが届きました。式の図形を使用して変数「xmlDoc」に書き込み、内容を確認できるようにします。次に、XMLの文字列を変数 "xmlDoc2"にロードし、その変数を2番目のメッセージに割り当てて、検証できるように書き出すメッセージ割り当てシェイプがあります。次に、別の式の形状を使用して、最初のメッセージを再度書き出そうとしましたが、明らかに2番目のメッセージ情報に置き換えられています。

並列形式ではなく、メッセージ割り当ては2番目のメッセージを作成するだけです。受信とこの問題が発生する場所の間で、いくつかの形状の決定を行い、受信メッセージから他のメッセージを作成しています。それらはすべて正常に動作し、何も上書きしません(後で実行しようとしているのと同じプロセスを実行します)。

誰かがこれを前に見た、または私が見逃しているものを見たことがありますか?

ETA:プロセスは次のように機能します。

Send Message comes in
xmlDoc = Send Message
xmlDoc.OuterXml is written to a table
xmlDoc2 = "<root><xml></xml></root>"
Second Message = xmlDoc2
xmlDoc2.OuterXml is written to a table
xmlDoc = Send Message <-- What should happen
xmlDoc = Second Message <-- What is happening
4

1 に答える 1

0

正確な問題を再現できませんでしたが、近づきました。プロセスの概要には、実際に何が起こっているのかを理解するために重要な暗黙のステートメントがいくつかあると思います。いずれにせよ、BizTalk メッセージは上書きされないと思いますが、XmlDocument 変数は上書きされます。

Java または VB6 のバックグラウンドを持つ開発者が C# を使用するときに遭遇する根本的な混乱の 1 つに見舞われたことがあると思います。

C# はマネージ言語です

C# はマネージド言語であり、ガベージ コレクターを使用してオブジェクトへの未使用の参照を再利用することを覚えておいてください。ここでのキーワードはReferenceです。

次の行を書くと:

xmlDoc2 = "<root><xml/></root>";
SecondMessage = xmlDoc2;

基本的に、同じコンテンツへの 2 つの参照があります。つまり、割り当てられた文字列を参照するxmlDoc2SecondMessageの 2 つの参照です。

そのため、BizTalk メッセージの XML コンテンツを "書き出す" ために使用するコードによっては、一部の参照を上書きしている可能性があります。

さらに、これが構成図形のコンテキストで発生すると、BizTalk メッセージ自体の内容を誤って上書きしてしまう可能性があります。

解決策?

この問題は、通常、BizTalk を使用している場合には発生しません。私は個人的にこの問題に遭遇したことはありません。

元の質問を Expression 図形と Assignment 図形の両方の正確なコードで更新する場合は、この回答をより適切なガイダンスで更新します。

于 2011-01-06T16:21:12.057 に答える