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

这样做的最有效方法是什么,因此而不打破流?我想在自定义管道组件中使用它 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().

有没有挑衅的方法可以做到这一点?

没有正确的解决方案

其他提示

您在管道组件中使用流类的事实并不能使其成为 流管线组件per-se 正如您直观地想知道的。

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

  • 首先,您创建客户 System.IO.Stream 类 - 这是包裹原始传入流并公开流界接口的类。在此课程中,您将有效地处理字节 当他们被读 通过调用代码。此类不应对BizTalk有任何依赖性,您应该能够为BizTalk之外的此类创建一个示例单位测试程序。

对于第一种情况,我建议您浏览到其中之一 几篇文章 使用源代码样本.

  • 其次,管道组件本身,其唯一的责任是用自定义流的实例将传入流替换。这是一个惯用的模式,您会在良好的管道组件中找到。特别是在执行期间 执行方法, 您不应该阅读原始传入流. 。阅读将发生 - 自动 - 当 消息传递代理 接手。

以下片段应该是 规范源代码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 班级。

正如我在回应中写的那样 以下问题, ,我强烈建议您查看整个帖子 尼克·巴登 已经完成了开发流管线组件的做法。

对于简单的不可阅读流的情况,您可以创建一个包装流,该流按照需要在需要的情况下进行替换 Stream.Read (可能是 Stream.ReadByte) 方法。但是,这些与RAW字节一起使用,因此您可能还必须考虑到流编码的流。

我认为方法是保持完成和处理缓冲区,然后当您将新内容写入流中时,您将其保存在待处理的缓冲区中,直到您不再需要替换为止。替换或确定没有什么可以替换该数据从待处理到完成缓冲区的移动。读取方法只能从完成的缓冲区中读取,写入只能写入处理缓冲区,而齐平移动了所有待处理。

我不喜欢冲洗部分,我想自己如何以最好的方式做到这一点,因为我需要编写通用的弦替换流。

编辑]对不起,回答了2年的帖子... [/edit

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top