0

いくつかの txt ファイルを含む xxx.GZ ファイルを送信ポートに展開できるカスタム BizTalk 2013 R2 (受信または送信) パイプラインを作成しようとしました。

これが私が今まで試したことです:

PS。.Net の IO GZip クラスを使用しました。

  1. BTS アプリケーションを作成し、受信場所と送信ポートを構成しました。

  2. 受信場所は、私が作成したカスタム パイプラインを使用します。ここに、私が試したカスタム パイプラインのコードを示します。

        public void Disassemble(IPipelineContext pc, IBaseMessage inmsg)
        {
            IBaseMessagePart bodyPart = inmsg.BodyPart;
    
            if (bodyPart != null)
            {
                Stream originalStream = bodyPart.GetOriginalDataStream();
    
               if (originalStream != null)
                {                     
                    using (GZipStream gZipInputStream = new GZipStream(new MemoryStream(originalStream.ReadByte()), CompressionMode.Decompress))
                    {    
                        MemoryStream memStream = new MemoryStream();
                        byte[] buffer = new Byte[1024];
    
                        int bytesRead = 1024;
                        while (bytesRead != 0)
                        {
                            bytesRead = gZipInputStream.Read(buffer, 0, buffer.Length);
    
                            gZipInputStream.CopyTo(buffer, 0);
                            memStream.Write(buffer, 0, bytesRead);
                        }
    
                        IBaseMessage outMessage;
                        outMessage = pc.GetMessageFactory().CreateMessage();
                        outMessage.AddPart("Body", pc.GetMessageFactory().CreateMessagePart(), true);
                        memStream.Position = 0;
                        outMessage.BodyPart.Data = memStream;
    
                        outMessage.Context = PipelineUtil.CloneMessageContext(inmsg.Context);
    
                        _msgs.Enqueue(outMessage);
    
                        }
                    }   
            }
    
        }
    

このコードは、私が望むようには機能しないようです。GZ ファイルを送信ポートに解凍せずに送信するだけです。実装されたパイプラインを受信場所ポートで使用します。BizTalk が受信場所で GZ パック ファイルを受信すると、この受信場所でサブスクライブする送信ポートにファイルを送信するだけです。パイプラインは GZ ストリームに対して何もしていないようです。すべきことは、GZ ファイルをアンパックし、アンパックされたすべてのファイルを送信ポートに送信することです。これは、アンパック ファイルを配置する必要があるフォルダーを指します。

うまくいかずにグーグルで検索しようとしましたが、存在するサンプルはうまくいかないようです。

誰でも私を助けたり、コードで何が間違っているかを教えてくれます。いくつかの txt ファイルを含む受信した GZ ファイルを送信ポート (フォルダーを指す) に解凍できる C# カスタム BizTalk 2013 R2 (受信または送信) パイプラインを実装したいだけですか?

アップデート:

Dissambler バージョンが機能しなかったので、デコード バージョンを作成しました。

パイプラインのデコード コードは次のとおりです。

                #region IComponent members
    /// <summary>
    /// Implements IComponent.Execute method.
    /// </summary>
    /// <param name="pc">Pipeline context</param>
    /// <param name="inmsg">Input message</param>
    /// <returns>Original input message</returns>
    /// <remarks>
    /// IComponent.Execute method is used to initiate
    /// the processing of the message in this pipeline component.
    /// </remarks>
    public Microsoft.BizTalk.Message.Interop.IBaseMessage Execute(Microsoft.BizTalk.Component.Interop.IPipelineContext pc, Microsoft.BizTalk.Message.Interop.IBaseMessage inmsg)
    {
        if (null == pc) throw new ArgumentNullException("pContext", "Pipeline context can not be null");

        if (null == inmsg) throw new ArgumentNullException("pInMsg", "Input message can not be null");

        IBaseMessagePart bodyPart = inmsg.BodyPart;

        if (bodyPart != null)
        {
            GZipStream strm = new GZipStream(bodyPart.GetOriginalDataStream(), CompressionMode.Decompress);
            bodyPart.Data = strm;
            pc.ResourceTracker.AddResource(strm);
        }

        return inmsg;
    }
    #endregion

GZip ファイル内の各ファイルの正しいファイル名を取得するにはどうすればよいですか? したがって、メッセージが送信ポートに送信されると、正しいファイル名でファイルが書き込まれます。

4

1 に答える 1

1

カスタム パイプライン コンポーネントを逆アセンブル ステージとして実装したように見えますが、実際には次の 2 つの理由からデコード ステージ パイプライン コンポーネントである必要があります。

  1. 逆アセンブル段階では、実行できるコンポーネントは 1 つだけです。つまり、フラット ファイル、XML、または JSON 逆アセンブラーを実行することもできません。
  2. 逆アセンブル ステージ コンポーネントの場合は、プローブを実装して、メッセージが認識されるかどうかを確認する必要もあります。そうでない場合は実行されません。

MSDN受信パイプラインを参照してください

デコードステージ

  • このステージは、メッセージをデコードまたは復号化するコンポーネントに使用されます。
    • 着信メッセージをある形式から別の形式にデコードする必要がある場合は、MIME/SMIME Decoder パイプライン コンポーネントまたはカスタム デコード コンポーネントをこのステージに配置する必要があります。
  • このステージは、1 つのメッセージを受け取り、1 つのメッセージを生成します。
  • このステージには、0 ~ 255 個のコンポーネントを含めることができます。
  • このステージのすべてのコンポーネントが実行されます。

分解ステージ

このステージは、メッセージを解析または逆アセンブルするコンポーネントに使用されます。

  • このステージ内のコンポーネントは、メッセージをプローブして、メッセージの形式が認識されているかどうかを確認します。フォーマットの認識に基づいて、コンポーネントの 1 つがメッセージを逆アセンブルします。
  • このステージに複数のコンポーネントが含まれている場合、メッセージ形式を認識する最初のコンポーネントのみが実行されます。ステージ内のどのコンポーネントもメッセージ形式を認識しない場合、メッセージ処理は失敗します。
  • このステージには、メッセージの内容を逆アセンブルするための特別な動作を実装するカスタム コンポーネントを含める必要があります。
  • このステージには、0 ~ 255 個のコンポーネントを含めることができます。ステージにコンポーネントがない場合、メッセージは通過します。

更新:質問の更新により、少しトリッキーになります。メッセージを複数のメッセージに分割する必要がある場合、それを実行できる唯一のステージは逆アセンブル ステージです。そのため、そのバージョンに戻ってデバッグし、解凍が実行されない理由を突き止める必要があります。

Zip 逆アセンブラー UnzipDisassemblyr - Gzipではなく Zip ファイル用の BizTalk Server 2004 のカスタム パイプライン コンポーネントの古いコード サンプルがあります。しかし、それは同じ種類のパターンに従います。また、メッセージを発行して次のファイルを解析するための GetNextEntry と同様のメソッドも必要です。ファイル名などのコンテキスト プロパティを設定できるのは、outmsg の作成段階です。

于 2016-10-04T10:46:01.797 に答える