等待 Azure Function Apps 中的 .exe 输出

Waiting for .exe output in Azure Function Apps

我正在尝试从 Azure Function App 中的 .exe 应用程序接收输出。 Function 应用程序由 HTTP 请求触发。

函数应用程序触发并 运行s 可执行文件。然后我想等待 .exe 到 运行 和 return 如果可能的话,输出作为 HTTP 响应中的 Json 字符串。这是我的代码:

namespace FunctionApp
{
    public static class NmapFunction
    {
        [FunctionName("NmapFunction")]
        public static async Task<HttpResponseMessage> Run(

            // wait for HTTP trigger on et or post method. Route is defualt.
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            string output = string.Empty;

            //Start the nmap .exe
            var Process = new Process
            {
                StartInfo = new ProcessStartInfo
                {
                    FileName = "Nmap.exe",
                    Arguments = "-sS -Pn 127.0.0.1",
                    UseShellExecute = true,
                    RedirectStandardOutput = true,
                    CreateNoWindow = true
                }
            };

            Process.Start();

            while (!Process.StandardOutput.EndOfStream)
            {
                string line = Process.StandardOutput.ReadLine();

                //add each line to the output string
                output += line;
            }

            Process.WaitForExit();

            string toolOutput = Newtonsoft.Json.JsonConvert.SerializeObject(new ToolRunResult { Result = output }).ToString();

            return new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new StringContent(ToolOutput, Encoding.UTF8, "application/json")
            };

        }

我在 运行 HTTP 请求时收到 500 内部服务器错误。这是因为 while 循环中的 System.InvalidOperationException' in System.Diagnostics.Process.dll 错误。我相信这是因为这是一个同步操作,据我所知,Azure 函数应用程序必须是异步的。

所以,我的问题是 从该 .exe 进程获取输出的最佳方法是什么?有可能吗?

ToolRunResult class:

internal class ToolRunResult
{
    internal int StatusCode { get; set; }
    internal string Result { get; set; }
}

What is the best way to get the output from this .exe process? Is it even possible?

是的,在 Azure 函数中是可能的。

请按照 Azure Function

中 运行 nMap.exe 的解决方法

这里我使用计时器触发器 运行 .exe 文件并捕获 .exe[=28= 的输出响应].

public void Run([TimerTrigger("0 */3 * * * *")]TimerInfo myTimer, ILogger log)
        {
            var p = new Process();
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardOutput = true;
            string eOut = null;
            p.StartInfo.RedirectStandardError = true;
            p.ErrorDataReceived += new DataReceivedEventHandler((sender, e) =>
            { eOut += e.Data; });
            p.StartInfo.FileName = "C:\Program Files (x86)\Nmap\nmap.exe";
            p.StartInfo.Arguments = "-sS -Pn 127.0.0.1";
            p.Start();

            // To avoid deadlocks, use an asynchronous read operation on at least one of the streams.  
            p.BeginErrorReadLine();
            string output = p.StandardOutput.ReadToEnd();
            p.WaitForExit();

            log.LogInformation($"The nMap Exe Result are:\n'{output}'");
            log.LogInformation($"\nError stream: {eOut}");
            log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
        }

结果

错误在 StartInfo 变量中。 UseShellExecute 必须设置为 false

不确定这背后的原因,但它成功了。