【问题标题】:Pipe STDOUT/STDIN with two process and a web output stream in C#在 C# 中使用两个进程和一个 Web 输出流来管道 STDOUT/STDIN
【发布时间】:2011-01-24 04:27:29
【问题描述】:

我有两个进程想用 C# 进行管道传输,然后将第二个进程的输出直接发送到 HTTP 输出流。

在命令行中,我可以做到这一点,而且效果很好(其中“-”代表标准输入/标准输出):

proc1 "file_to_input" - | proc2 - -

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

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

【问题讨论】:

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


    【解决方案1】:

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

    在 .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。

    相关链接:

    【讨论】:

    • 这方面的复杂部分是在输入一个流的同时从另一个流中读取。这是一种三向情况,您必须同时从一个读取,写入第二个,然后从第二个读取。我不确定如何在同时提供新数据的同时接收第二个的输出。
    【解决方案2】:

    试试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();
    

    【讨论】:

      猜你喜欢
      • 2012-03-30
      • 2018-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-25
      • 1970-01-01
      • 2021-04-27
      • 2010-11-20
      相关资源
      最近更新 更多