【问题标题】:c# OutputDataReceived does not work with curlc# OutputDataReceived 不适用于 curl
【发布时间】:2022-01-05 01:40:46
【问题描述】:

以下是使用 OutputDataReceived 从 curl 中捕获详细信息的代码。

没有信息可以通过这种方式捕获。怎么了?

var command = "curl.exe -vs -o test.html https:\\www.google.com";
var procStartInfo = new ProcessStartInfo("cmd", "/c " + command);
procStartInfo.RedirectStandardOutput = true;
procStartInfo.UseShellExecute = false;
procStartInfo.CreateNoWindow = true;
var proc = new Process();
proc.EnableRaisingEvents = true;
proc.OutputDataReceived += (s, e) => {if(!string.IsNullOrEmpty(e.Data)) textBoxLog.AppendText(e.Data); };
proc.StartInfo = procStartInfo;
proc.Start();
proc.BeginOutputReadLine();
proc.WaitForExit();
proc.Close();

【问题讨论】:

    标签: c# curl


    【解决方案1】:

    --output(或-o)将下载的内容写入给定文件(而不是将其写入标准输出)。 cURL 的其余输出(进度表、错误消息、详细模式等)仍然写入 stderr,显示在终端中。 https://en.wikipedia.org/wiki/Standard_streams

    这意味着您只能看到带有OutputDataReceived 的C# 中的HTML 输出,而不能看到详细模式的输出。

    此代码在一个正在运行的控制台应用程序中,将所有详细信息打印到控制台,而无需使用Console.WriteLine() 手动编写:

    System.Diagnostics.Process process = new System.Diagnostics.Process();
    System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
    startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
    startInfo.FileName = @"C:\Windows\System32\curl.exe";
    startInfo.Arguments = @"https://vi.stackexchange.com/ -vs";
    startInfo.RedirectStandardOutput = true;
    process.StartInfo = startInfo;
    process.Start();
    

    您可以通过 bat 使用 curl详细模式 的输出保存到 txt 文件 strong> 以这种方式:

    curl https://vi.stackexchange.com/ -vs >curl-output.txt 2>&1
    

    或者您可以阅读StandardError streamErrorDataReceived

    我建议使用HttpWebRequest,如on this question 所示,而不是使用 curl 作为进程来执行请求,除非您有特定原因。

    【讨论】:

    • 谢谢!我不知道所有的详细信息都是标准错误,而不是标准输出。我刚刚通过重定向和接收stderr得到了我想要的。非常感谢!
    • 顺便说一句。我尝试使用 HttpClient,但无法通过它获取详细信息。这是我的问题:stackoverflow.com/questions/70584691/…
    【解决方案2】:

    感谢 Malware Werewolf 为我指明了正确的方向。详细信息是标准错误,而不是标准输出。以下是用于捕获详细信息的更正代码。

    var command = "curl.exe -vs -o test.html https:\\www.google.com";
    var procStartInfo = new ProcessStartInfo("cmd", "/c " + command);
    procStartInfo.RedirectStandardError = true;
    procStartInfo.UseShellExecute = false;
    procStartInfo.CreateNoWindow = true;
    var proc = new Process();
    proc.EnableRaisingEvents = true;
    proc.ErrorDataReceived += (s, e) => {if(!string.IsNullOrEmpty(e.Data)) textBoxLog.AppendText(e.Data); };
    proc.StartInfo = procStartInfo;
    proc.Start();
    proc.BeginErrorReadLine();
    proc.WaitForExit();
    proc.Close();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-05
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-29
      • 2015-09-19
      相关资源
      最近更新 更多