Разработка CGI-программ в среде Visual Studio

Как уже отмечалось, обмен данными CGI-программ с сервером идет через входной и выходной потоки, поэтому разрабатываются они как консольные приложения.

Создание консольных приложений детально рассмотрено в п.п. 1.4, поэтому ограничимся рассмотрением примера.

Пример 4.2.

Создать Web-приложение, выполняющее регистрацию пользователя на основе введенного имени и пароля.

Приложение будет состоять из страницы для ввода данных, CGI-программы для обработки введенных данных и XML-файла, содержащего данные о зарегистрированных пользователях. Страница может быть создана с использованием любого средства, например, программы Блокнот или как файл HTML в среде Visual Studio.

Код HTML-страницы для ввода данных:

<html>

<HEAD>

<TITLE>CGI Program</TITLE>

</HEAD>

<body>

<CENTER><FONT size=6>Если Вы зарегистрированный пользователь, введите имя и пароль!</FONT></CENTER><BR><BR>

<form action=log_reg.exe >

<b>Имя</b>

<input type=text name=log>

<b>Пароль</b>

<input type=text name=pass>

<input type=hidden name="tip" value="log">

<input type=submit value=" Вход ">

</form>

<b>Если вы не зарегистрированы, зарегистрируйтесь!</b>

<form action=log_reg.exe >

<b>Имя</b>

<input type=text name=log>

<b>Пароль</b>

<input type=text name=pass>

<input type=hidden name="tip" value="reg">

<input type=submit value="Регистрация">

</form>

</body>

</html>

Вид страницы в окне браузера:

Страница содержит две формы, одну для ввода данных зарегистрированных пользователей, другую – для регистрации новых. Скрытые поля в формах будут использованы для распознавания источника данных. В качестве запрашиваемого ресурса при отправке данных указана программа log_reg.exe. Метод отправки данных – GET (по умолчанию).

Для хранения данных о пользователях предлагается использовать XML-файл users.xml, такой структуры:

<?xml version="1.0" standalone="yes"?>

<DataSet>

<user>

<login> </login>

<pass> </pass>

</user>

</DataSet>

Для каждого нового пользователя в файл будет добавляться тег <user> …</user>.

Программа обработки должна выделить переданные данные из переменных окружения, проверить значение скрытого поля (name="tip") и если оно установлено reg (новый пользователь), сравнить значение из поля name=log с именами зарегистрированных пользователей из файла users.xml. При совпадении в выходной поток направляется страница, содержащая предложение выбрать другое имя. Если такого имени нет, имя и пароль добавляются в файл, клиенту сообщается об успешной регистрации.

Если значение скрытого поля равно log (пользователь зарегистрирован), то имя и пароль сравниваются с теми, что хранятся в users.xml. При совпадении предлагается продолжить работу с ресурсом, в противном случае – повторить попытку ввода.

В среде Visual Studio создается новый проект, выбирается тип C# и Console Application, указывается место на диске и присваивается имя log_reg. В окне программы добавляется пространство имен System.Data (если его нет по умолчанию) и в объявлении класса Program вводится код программы:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Data;

namespace log_reg

{

class Program

{

public static DataSet DS;//Объект для работы с данными о польз.

public static void LoadDs()

{

DS = new DataSet(); //чтение из файла

DS.ReadXml(@".\users.xml");// данных о пользователях

}

private static void SaveDs()

{

DS.WriteXml(@".\users.xml");//запись в файл данных

} //о пользователях

public static bool NewUser(string login, string pass)

{

LoadDs();

foreach (DataRow dr in DS.Tables[0].Rows)

{ // проверка наличия

if (login.Equals(dr["login"])) // в данных имени пользователя

{

return false;

};

}

DS.Tables[0].Rows.Add(new object[] { login, pass });

SaveDs(); //добавление в файл нового

return true; // имени и пароля

}

public static bool CanLog(string login, string pass)

{

LoadDs(); //проверка наличия

foreach (DataRow dr in DS.Tables[0].Rows) //в данных введенных

{ //имени и пароля

if (login.Equals(dr["login"]) & pass.Equals(dr["pass"]))

{

return true;

};

}

return false;

}

static void Main(string[] args)

{

string query = System.Environment.GetEnvironmentVariable("QUERY_STRING");

//string query = "log=mvp1&pass=pmv1&tip=log";//значение для отладки

char[] SplitChars = new char[] { '=', '&' }; //разделение строки

string[] result = query.Split(SplitChars); //запроса на значения

if (result[5] == "reg")

{

Console.WriteLine("Content-Type:text/html\n");

Console.WriteLine("<html>");

Console.WriteLine("<head>");

Console.WriteLine("<TITLE>Страница ответа</TITLE>");

if (NewUser(result[1], result[3]))

{

Console.WriteLine("<p>Вы успешно зарегистрированы" + result[1] + "</p>");

}

else

{

Console.WriteLine("<p>Такой пользователь" + result[1] + "уже зарегистрирован" + "</p>");

}

Console.WriteLine("</body>\n");

Console.WriteLine("</html>\n");

};

if (result[5] == "log")

{

Console.WriteLine("Content-Type:text/html\n");

Console.WriteLine("<html>");

Console.WriteLine("<head>");

Console.WriteLine("<TITLE>Страница ответа</TITLE>");

Console.WriteLine("</head>");

Console.WriteLine("<body>");

if (CanLog(result[1], result[3]))

{

Console.WriteLine("<p>Успешный вход--" + result[1] + "</p>");

}

else

{

Console.WriteLine("<p>Ошибка в паре логин-пароль!!</p>");

}

Console.WriteLine("</body>");

Console.WriteLine("</html>");

};

}

}

}

Комментарии в коде дают представление о назначении основных объектов.

Поскольку при работе в среде отсутствует Web-сервер, то для формирования данных запроса используется присвоение значения переменной query, а строка для получения данных из переменных окружения должна быть помещена в комментарий.

В ходе отладки в среде правильность работы приложения контролируется по HTML-коду в окне вывода консоли.

Следует отметить, что код страниц, отправляемых клиенту, упрощен в целях сокращения общего объема текста. В реальных условиях HTML-код (статическая часть этих страниц) может быть достаточно большим, его целесообразно хранить в отдельных файлах, читать из них и направлять в выходной поток.

После автономной отладки в среде и компиляции со строкой получения данных из переменных окружения исполняемый файл log_reg.exe, файл с данными users.xml и страница index.htm копируются в папку сервера, соответствующую сайту. Папка должна иметь соответствующие разрешения на доступ. Конфигурация сервера должна позволять запуск CGI-программ (конфигурирование сервера Apache выполняется с использованием конфигурационных файлов, IIS – соответствующей консоли управления).

После выполнения всех указанных настроек проверяется работа ресурса с использование браузера.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: