Ответы пользователя по тегу Веб-серверы
  • Как обработать запрос с формы на сервере?

    s2d1ent
    @s2d1ent Автор вопроса
    Специалист технической поддержки
    Использование CGI с C# и передача POST
    class Program
        {
            static void Main(string[] args)
            {
                string link = @"D:\csharp_server\program\program\bin\Debug\net5.0\includes\php\win86\php-cgi.exe", //ссылка на CGI
                    text = @"D:\csharp_server\program\program\bin\Debug\net5.0\www\UPPDD\php\auth.php"; // ссылка на файл где идет использование POST/GET
                Console.WriteLine(UseInterpreter(link, text));// вывод в консоль для просмотра
                Console.ReadKey();
            }
            static string UseInterpreter(string php, string file)
            {
                ProcessStartInfo info = new ProcessStartInfo(php);
                string req = "login=admin&pass=secretpass&but=%D0%92%D0%BE%D0%B9%D1%82%D0%B8"; // параметры формы
                info.UseShellExecute = false;
                info.ErrorDialog = false;
                info.RedirectStandardError = true;
                info.RedirectStandardInput = true;
                info.RedirectStandardOutput = true;
                info.CreateNoWindow = true;
                // переменные среды
                info.EnvironmentVariables.Add("REQUEST_METHOD", "POST");
                info.EnvironmentVariables.Add("HTTP_CONNECTION", $"keep-alive");
                info.EnvironmentVariables.Add("REDIRECT_STATUS", "false");
                info.EnvironmentVariables.Add("GETAWAY_INTERFACE", "CGI");
                info.EnvironmentVariables.Add("CONTENT_TYPE", "application/x-www-form-urlencoded");
                info.EnvironmentVariables.Add("CONTENT_LENGTH", Encoding.UTF8.GetBytes(req).Length.ToString());
                info.EnvironmentVariables.Add("HTTP_ACCEPT", "*.*");
                info.EnvironmentVariables.Add("SCRIPT_FILENAME", file);
                // передеча информации в Process и старт процесса
                Process p = new Process();
                p.StartInfo = info;
                bool pStarted = p.Start();
    
                StreamWriter input = p.StandardInput; // стандартынй поток ввода
                input.WriteLine(req); // ввод
                StreamReader output = p.StandardOutput; // поток вывода
                StreamReader error = p.StandardError; // поток вывода ошибки 
                // перекодировка, при наличии кириллицы php выводит в кодировке cp866, тут мы переводим из cp866 в utf8
                byte[] cp866_byte = output.CurrentEncoding.GetBytes(output.ReadToEnd());
                string cp866_byte_to_utf8 = Encoding.UTF8.GetString(cp866_byte);
    
                return cp866_byte_to_utf8;
            }
        }
    Ответ написан
    2 комментария