通过 POST 请求在 Windows Server 2022 上运行 CGI 应用程序 - 如何?

问题描述 投票:0回答:1

我不是 Windows Server 专业人士,但搜索网络没有给出最新答案。
设置如下:我有一台 Windows Server 2022 计算机。我想通过网络发布请求触发一个程序。用户发送表单数据 f=foo 和 b=bar,服务器应运行带有

myprogram.exe -f foo -b bar
的程序。

我怎样才能做到这一点?安全性无需担心,因为这是一个虚拟服务器,没有已知用户的公共访问权限。

post cgi windows-server
1个回答
0
投票

警告,以下内容仅用于概念证明。实际使用时,应根据实际需要进行调整。

开发电脑

  • 操作系统:Windows 10

安装并配置开发软件

下载 DotNet SDK 7 并安装

配置 NuGet

  • 打开CMD.exe

  • 运行命令:添加NuGet源

dotnet nuget add source https://api.nuget.org/v3/index.json -n nuget.org

  • 运行命令:检查 NuGet 源
dotnet nuget list source

准备项目目录

接下来我们将创建一个项目目录:

ST_NET7_EXAMPLES

mkdir  %USERPROFILE%\Documents\ST_NET7_EXAMPLES

项目1:MyProgram(测试用)

创建项目

cd %USERPROFILE%\Documents\ST_NET7_EXAMPLES
dotnet new console -n MyProgram

编辑
MyProgram\Program.cs

using System;
using System.IO;

class Program
{
    static void Main(string[] args)
    {

        Console.WriteLine("Hello, World!");
    
        string fooValue = null;
        string barValue = null;

        for (int i = 0; i < args.Length; i++)
        {
            if (args[i] == "-f" && i + 1 < args.Length)
            {
                fooValue = args[i + 1];  // Get the value after `-f`
            }
            else if (args[i] == "-b" && i + 1 < args.Length)
            {
                barValue = args[i + 1];  // Get the value after `-b`
            }
        }

        // Print results
        Console.WriteLine($"-f: {fooValue}");
        Console.WriteLine($"-b: {barValue}");
        
        // Get the user's home directory
        string userHomeDirectory = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);

        // Set the path of the log file
        string logFilePath = Path.Combine(userHomeDirectory, "app.log");

        // Write to log file
        using (StreamWriter writer = new StreamWriter(logFilePath, append: true))
        {
            writer.WriteLine($"-f: {fooValue}");
            writer.WriteLine($"-b: {barValue}");
            writer.WriteLine($"Logged at: {DateTime.Now}");
        }

        Console.WriteLine($"Log written to {logFilePath}");
        
    }
}

构建

cd %USERPROFILE%\Documents\ST_NET7_EXAMPLES\MyProgram

dotnet build

奔跑

dotnet run -- -f foo -b bar

创建发布

dotnet publish -c Release -o ..\MyProgramApp

项目1:MyProgram的输出到这里已经完成了。

项目 2:DemoApp(您想要在 Windows Server 上安装的功能。)

创建项目

cd %USERPROFILE%\Documents\ST_NET7_EXAMPLES

dotnet new webapi -n DemoApp

我们需要添加一些文件

DemoApp
├── DemoApp.csproj
├── appsettings.Development.json
├── appsettings.json
├── Controllers
│   ├── DemoController.cs <Add File>
│   └── WeatherForecastController.cs
├── Models <Create Directory>
│   └── Parameters.cs <Add File>
...

模型\参数.cs

namespace DemoApp.Models
{
    public class Parameters
    {
        public string F { get; set; }
        public string B { get; set; }
    }
}

控制器\DemoController.cs

using Microsoft.AspNetCore.Mvc;
using System.Diagnostics;

using DemoApp.Models;

namespace DemoApp.Controllers
{
    [ApiController]
    [Route("api/[controller]")]
    public class DemoController : ControllerBase
    {
        // POST api/demo
        [HttpPost]
        public IActionResult Post([FromBody] Parameters parameters)
        {
            if (parameters == null)
            {
                return BadRequest("Invalid input");
            }

            // Access the parameters f and b
            var f = parameters.F;
            var b = parameters.B;

            // Print Parameters
            Console.WriteLine($"-f: {f}");
            Console.WriteLine($"-b: {b}");

            // Define the external program path
            //Linux
            //string programPath = "/home/demo/Desktop/TMP/ST_C_Sharp_X/CODE/myprogram/bin/Debug/net7.0/myprogram";
            //Windows
            // string programPath = "C:\\Users\\User\\Documents\\ST_C_Sharp_X\\CODE\\myprogram\\bin\\Release\\net7.0\\myprogram.exe";
            string programPath = "C:\\TOOLS\\MyProgramApp\\MyProgram.exe";

            // Create the process start info
            var processStartInfo = new ProcessStartInfo
            {
                FileName = programPath,
                Arguments = $"-f {f} -b {b}", // Pass parameters as command line arguments
                RedirectStandardOutput = true,  // Capture standard output if needed
                RedirectStandardError = true,   // Capture standard error if needed
                UseShellExecute = false,        // Required to redirect output
                CreateNoWindow = true           // Do not create a console window
            };
            
            try
            {
                // Start the process
                using (var process = Process.Start(processStartInfo))
                {
                    if (process == null)
                    {
                        return StatusCode(500, "Failed to start the process");
                    }

                    // Optionally capture output (if the program writes output)
                    string output = process.StandardOutput.ReadToEnd();
                    string error = process.StandardError.ReadToEnd();

                    // Wait for the process to exit
                    process.WaitForExit();

                    // Check if there was any error
                    if (process.ExitCode != 0)
                    {
                        return StatusCode(500, $"Process failed with exit code {process.ExitCode}: {error}");
                    }

                    // Return the output or a success message
                    return Ok(new { message = "Process completed successfully", output });
                }
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Error running process: {ex.Message}");
            }
        
            return Ok(new { message = $"Received: f = {f}, b = {b}" });
        }
    }
}

构建发布

dotnet publish -c Release -o ../publish

最终结果

ST_NET7_EXAMPLES
├── DemoApp
├── MyProgram
├── MyProgramApp (1)
└── publish      (2)

请将目录 (1)

MyProgramApp
(2)
publish
复制到您的 Windows Server。

您的 Windows 服务器

下载并安装

MyProgramApp
目录

复制

MyProgramApp
C:\TOOLS

完整路径是

C:\TOOLS\MyProgramApp

publish
目录

复制

publish
C:\

完整路径是

C:\publish

配置 IIS 站点

添加网站

站点 ->

Add Website...

x005

输入站点数据

x006

站点名称:

DemoApp
物理路径:
C:\publish

点击按钮:

OK

忽略警告

因为我们的设置

*:80
与默认的IIS站点相同,所以会有警告。

点击按钮

Yes

x007

停止默认网站

选择

Default Web Site

点击按钮

Stop

x008

启动 DemoApp 网站

选择

DemoApp

点击按钮

Start

x009

测试

打开CMD.exe

运行命令:

curl -X POST ^
  "http://localhost/api/demo" ^
  -H "Content-Type: application/json" ^
  -d "{\"f\":\"IISDemoAppHello\", \"b\":\"IISDemoAppWorld\"}"

返回:

{"message":"Process completed successfully","output":"Hello, World!\r\n-f: IISDemoAppHello\r\n-b: IISDemoAppWorld\r\nLog
 written to C:\\Users\\TEMP\\app.log\r\n"}

可以打开

C:\Users\TEMP\app.log

-f: IISDemoAppHello
-b: IISDemoAppWorld
Logged at: 9/19/2024 11:44:58 PM

我没有相应的Windows Server。以上步骤是在Windows 10上开发和测试的。 因此,IIS部署的设置屏幕可能会有所不同。

这不是 CGI 程序。这是部署在 IIS 上的 DotNet 程序。

© www.soinside.com 2019 - 2024. All rights reserved.