Ris*_*nst 6 c# biztalk inputstream custom-pipeline-component
我有一个包含文本的流,现在我想在该流中编辑一些文本(替换一些值).
最有效的方法是什么,所以不打破流?我想在自定义管道组件中使用它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;
}
Run Code Online (Sandbox Code Playgroud)
这是代码,但正如你所知,我正在打破流sr.ReadToEnd().
有没有更好的方法来做到这一点?
您在管道组件中使用 Stream 类的事实并不像您直观地想知道的那样使其本身成为Streaming 管道组件。
最合适的方法是将职责分为两个部分:
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;
}
Run Code Online (Sandbox Code Playgroud)
看?在前面的方法中没有任何阅读。整个处理应该Read在您的自定义Stream类中的方法的(重复)调用期间发生。
正如我在对以下问题的回答中所写的那样,我强烈建议您查看Nic Barden所做的关于开发流式管道组件的整个系列文章。
对于不可查找的只读流的简单情况,您可以创建一个包装器流,根据需要在Stream.Read(也可能是Stream.ReadByte)方法中进行即时替换。然而,这些使用原始字节,因此您可能还必须考虑流编码。