使用C#中的两个进程和Web输出流管道STDOUT / STDIN

时间:2010-03-05 15:53:12

标签: c# asp.net http command-line binary

我有两个进程要与C#一起管道,然后将第二个进程的输出直接发送到HTTP输出流。

在命令行中,我可以做到这一点并且它完美地工作(其中“ - ”代表stdin / stdout):

proc1 "file_to_input" - | proc2 - -

我的问题是在C#中连接这两个进程并且能够获取proc2的STDOUT并将其直接移植到Web上,而不首先缓冲整个事物。输入和输出将是二进制数据类型,因此我需要将其从默认的StreamReader / Writer转换。

这是可能的,最好的方法是什么?谢谢!

2 个答案:

答案 0 :(得分:0)

除非我误解你,否则这是正常的“从一个流读取,写入另一个流”的情况,你声明一个大小的缓冲区,只是继续读取输入并写入输出,直到没有剩下从输入中读取。

在.NET 4.0中,他们在Stream上添加了一个CopyTo方法,以简化这一过程,但您可以自己执行相同的代码。

Stream source = ...;
Stream destination = ...;
byte[] buffer = new byte[4096];
int read;
while ((read = source.Read(buffer, 0, buffer.Length)) != 0) {
    destination.Write(buffer, 0, read);
}

在你的情况下,听起来你可以通过Console.OpenStandardInput获取源代码 - 对于目的地我不是100%确定你的意思是“将它直接移植到网络上”,但因为我们是一个控制台应用程序而不是一个asp.net页面,我假设你把它发送到某个目标页面。如果您使用的是WebClient,则可以使用其OpenWrite方法。如果它是一个asp.net页面,从一个单独的进程读取它,它可以将它写入Response.OutputStream。

相关链接:

答案 1 :(得分:0)

尝试CliWrap

var cmd1 = Cli.Wrap("proc1").WithArguments(a => a.Add("file_to_input").Add("-"));
var cmd2 = Cli.Wrap("proc2").WithArguments(a => a.Add("-").Add("-"));

await (cmd1 | cmd2).ExecuteAsync();

如果您想将输出重定向到其他流(例如HTTP流),则:

var output = new MemoryStream();
var cmd1 = ...;
var cmd2 = ...;

await (cmd1 | cmd2 | output).ExecuteAsync();