我有一个包含文本的流,现在我想在该流中编辑一些文本(替换一些值)。

在不中断数据流的情况下,最有效的方法是什么?
我想在BizTalk的自定义管道组件中使用它。

public IBaseMessage Execute(IPipelineContext pContext, IBaseMessage pInMsg)
{
    string msg = "";
    using (VirtualStream virtualStream = new VirtualStream(pInMsg.BodyPart.GetOriginalDataStream()))
    {
        using(StreamReader sr = new StreamReader(VirtualStream))
        {
            msg = sr.ReadToEnd();
        }

        // modify string here
        msg = msg.replace("\r\n","");

        while (msg.Contains(" <"))
           msg = msg.Replace(" <", "<");

        VirtualStream outStream = new VirtualStream();
        StreamWriter sw = new StreamWriter(outStream, Encoding.Default);
        sw.Write(msg);
        sw.Flush();
        outStream.Seek(0, SeekOrigin.Begin);

        pInMsg.BodyPart.Data = outStream;
        pContext.ResourceTracker.AddResource(outStream);
    }

    return pInMsg;
}

这是代码,但是如您所见,当我执行sr.ReadToEnd()时,我正在中断流。

有没有更好的方法可以做到这一点?

最佳答案

直觉上想知道的事实是,您在管道组件中使用Stream类并不意味着它本身就是一个Streaming管道组件。

最合适的方法是将职责分为两个部分:

  • 首先,创建一个客户System.IO.Stream类-这是一个包装原始传入流并公开流接口(interface)的类。在此类中,您将有效地处理调用代码读取的字节。该类不依赖于BizTalk,并且您应该能够在BizTalk之外为该类创建一个示例单元测试程序。

  • 对于第一种情况,建议您浏览到several articles with source code samples之一。
  • 其次,管道组件本身,其唯一职责是用自定义流的实例替换传入的流。您会在优质的管道组件中找到这种惯用模式。特别是在执行Execute method期间,您不应阅读原始传入流。当Messaging Agent接管时,读取将自动发生(自动)。

  • 以下代码段应该是Execute方法的规范源代码,当然,除了用于错误处理的其他代码外:
    IBaseMessage IComponent.Execute(IPipelineContext pContext, IBaseMessage pInMsg)
    {
       // assign a new CustomStream to the incoming message
    
        System.IO.Stream stream = pInMsg.BodyPart.GetOriginalDataStream();
        System.IO.Stream customStream = new CustomStream(stream);
    
        // return the message for downstream pipeline components (further down in the pipeline)
    
        pInMsg.BodyPart.Data = customStream;
        pContext.ResourceTracker.AddResource(customStream);
    
        return pInMsg;
    }
    

    看?在上述方法中无任何读数。整个处理应该在自定义Read类中的Stream方法的(重复)调用期间进行。

    正如我在对the following question的回复中所写的那样,我强烈建议您阅读Nic Barden关于开发流传输管道组件所做的全部系列文章。

    关于c# - 如何在BizTalk管道组件中有效地修改流中的文本?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4625819/

    10-15 06:46