次の方法で共有


XLANGMessage として表されるメッセージ

XLANGMessage オブジェクトは、XLANG サービスで宣言されたメッセージ インスタンスを表します。 このオブジェクトを取得するには、メソッド呼び出しのパラメーターとしてメッセージに参照を渡します。 XLANGPart オブジェクトは、XLANG サービス内のメッセージ インスタンスに含まれるメッセージ 部分を表します。 このオブジェクトは、受信パラメーターの型が XLANGPart であるメソッド呼び出しでパーツ参照を渡すか、 XLANGMessage の渡された参照を列挙することによって取得されます。

オーケストレーション メッセージ変数は、ユーザー コンポーネントに渡され、 XLANGMessage オブジェクトとして受け取られる場合があります。 XLANGMessage オブジェクトを使用すると、パーツにアクセスし、メッセージ プロパティにアクセスできます。ユーザーは XLANGMessage を "保留" して、宣言されたスコープを超えて有効期間を延長できます。 その後、 XLANGMessage がメソッドから返され、オーケストレーション内のメッセージ変数に割り当てられる場合があります。

XLANGMessage の作成

ストリームを使用して XLANGMessage を構築する場合、ストリーム型は IStreamFactory を実装するか 、MemoryStream にする必要があります。 次のコード サンプルは、 XLANGMessage を構築する方法を示しています。

public class FileStreamFactory : IStreamFactory  
{  
    string _fname;  
  
    public FileStreamFactory(string fname)  
    {  
        _fname = fname;  
    }  
  
    public Stream CreateStream()  
    {  
        return new FileStream  
        (  
            _fname,  
            FileMode.Open,  
            FileAccess.Read,  
            FileShare.Read  
        );  
    }  
}  
  
public static void AssignStreamFactoryToPart(XLANGMessage msg)  
{  
    IStreamFactory sf = new FileStreamFactory( @”c:\data.xml” );  
    msg[0].LoadFrom( sf );  
}  

送信元メッセージを変換しないで新しいメッセージを作成することが必要な場合もあります。 これを行うには、System.Xml 型の変数を使用します 。XmlDocument と読み込み、またはその他の方法で適切なコンテンツを構築します。 次の例では、XmlDocumentLoadXml メソッドを使用して、文字列から XML を読み込みます。

XmlVariable.LoadXml("<ns0:Root PONumber="047745351122111" xmlns:ns0="http://BTSHTTPSend.SimpleSchema"><MyChildRecord SubAttr1="Simple Attribute " /></ns0:Root>");  
XLANGMessage XmlMsg = XmlVariable;  
  

次の例では、XmlDocument の Load メソッドを使用してファイルから XML を読みみます。

XmlVariable.Load("C:\MyData.xml");  
XLANGMessage XmlMsg = XmlVariable;  
  

Note

より大きなメッセージを作成する場合は、前のセクションで示したストリーミング 方法のいずれかを使用するか、オーケストレーション Designerで Transform 図形を使用することを検討してください。

XLANGMessage および XLANGPart を使用する際の考慮事項

ユーザー コードで XLANGMessageXLANGPart を 使用する場合は、次の点を考慮してください。

  • メッセージ部分を XLANGPart 引数として渡したり 、XLANGPart型の値を返したりしないでください。 パーツの型として XLANGPart を渡す必要があります。 次に例を示します。

    Message String msg;  
    Class.Test(msg);  
    // or you can do the following  
    Messagetype mt  
    {  
         String part;  
    };  
    Message mt msg;  
    Class.Test(msg,part);  
    
    

    また、メッセージ自体を XLANGMessage として渡し、 XLANGMessage 添字演算子を使用して関数呼び出し内の部分にアクセスすることもできます。 ただし、有効期間が関数呼び出しの有効期間を超えるコレクションに XLANGPart を配置しないでください。 代わりに、 コレクションに XLANGMessage を配置する必要があります。 次に例を示します。

    void Test(XLANGMessage xlm)
    {
         try
         {
             XLANGPart xlp = xlm[0];
             string sval = (string)xlp.RetrieveAs(typeof(string));
         }
         finally
         {
             xlm.Dispose();
         }
    }
    
  • オーケストレーション パラメーターを XLANGMessage または XLANGPart として定義しないでください。 メッセージを渡す必要がある場合は、メッセージの型のパラメーターを使用します。 部分を渡す必要がある場合は、代わりにメッセージを渡してから、部分を使用します。 部分の値だけが必要な場合は、部分の型を使用して部分を渡します。

  • メソッド呼び出しの XLANGMessage パラメーターを返さないでください。 渡された XLANGMessage パラメーターを返し、メソッド呼び出し内の パラメーターで Dispose メソッドを呼び出すことができない場合、直感的に有効期間の前提に違反し、例外もスローされます。 XLANGMessage パラメーターを介してメッセージをユーザー コードに渡す場合は、通常はメッセージが参照されていない特殊なコンテキストにメッセージを参照します。 このコンテキストの有効期間は、オーケストレーション インスタンスの有効期間です。 これは、BizTalk Server からは、ユーザー コードがメッセージを保持しているかどうかがわからないためです。

    オーケストレーション インスタンスが存在する場合、そのインスタンスで作成されたメッセージは有効ではないので、そのようなコレクションの有効期間は、インスタンスの有効期間以下でなければなりません。 ただし、オーケストレーション インスタンスと同じ有効期間を持つ XLANGMessage 引数を介してメッセージが渡されたときに、ループ内のメッセージ参照を解放する場合は、 XLANGMessage.Dispose を呼び出して参照を解放できます。 さらに、ユーザー コード メソッド内で XLANGMessage パラメーターがローカルでのみ使用され、パラメーターの有効期間が関数呼び出しの有効期間に含まれている場合は、 XLANGMessage.Dispose を呼び出してルート コンテキストへの参照を解放し、対応するメッセージに通常の有効期間動作を戻すこともできます。 次に例を示します。

    void Test(XLANGMessage xlm)
    {
         try
         {
            //XLANGMessage is only used locally
         }
         finally
         {
            xlm.Dispose();
         }
    }
    

    xlm をコレクションに配置する場合、クラス自体にクリーンアップ用の Dispose メソッドが必要です。 次に例を示します。

    public class A
    {
         Hashtable h = new Hashtable();
         public void Test(XLANGMessage xlm)
         {
             h[xlm] = 1;
         }
         //You can have more methods here
         public void Dispose()
         {
             foreach (XLANGMessage xlm in h.Keys)
             {
                 xlm.Dispose();
             }
         }
    }
    

    XLANGMessages のコレクションが終了したら、A.Dispose を呼び出します。

参照

XSD スキーマとして表されるメッセージ
.NET クラスとして表されるメッセージ
ユーザー コードでのメッセージの構築