c# Создание веб-сервера (дополнение)

Создание веб-сервера на языке c# (дополнение)

Данная статья является дополнением к предыдущей статье: как создать веб-сервер с помощью языка c#. В ней мы рассмотрим, как в зависимости от запроса клиента, можно возвращать содержимое той или иной html страницы.

Например, клиент отправляет запрос по адресу 192.168.10.1:8080/auto, в ответ получает содержимое страницы auto.html, если клиент запрашивает адрес 192.168.10.1:8080/hello, то получает содержимое страницы hello.html и так далее.

Создание хранилища

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

Переходим в окно Solution Explorer и создаём новую папку (Add -> New Folder), например mysite.

new folder

Добавление html страниц

Добавим в папку mysite несколько html страниц.

1. Нажимаем правую кнопку мыши на созданной папке и выбираем пункт Add -> New Item

new item

2. Переходим в раздел web и выбираем шаблон Html Page.

html page

3. Изменим имя файла, например на auto.html и нажмём на кнопку Add.

В результате в папке mysite появится файл auto.html.

solution explorer

По умолчанию в добавленном файле уже содержится набор html тегов описывающих каркас пустой html страницы. Если вы хотите внести какие-то изменения, то просто дважды щелкните по нему левой кнопкой мышки.

теги

Таким же способом можно добавить ещё несколько html страниц.

Обработка запросов

Хранилище создано, и теперь можно перейти к написанию кода.

Для начала добавим адреса, которые будет слушать, и обрабатывать наш веб-сервер. Список адресов можно поместить, например в массив:

string [] uri = { @"http://192.168.10.1:8080/auto/",
@"http://192.168.10.1:8080/say/",
@"http://192.168.10.1:8080/hello/" };

С помощью цикла foreach добавим адреса в коллекцию Prefixes.

private void StartServer(string [] prefixs)
{
foreach (string prefix in prefixs)
{
server.Prefixes.Add(prefix);
}
}

В данном примере все адреса имеют одинаковый номер порта, поэтому вместо того, чтобы создавать массив, можно просто указать серверу, чтобы он слушал и принимал все запросы на порт 8080.

string uri = @"http://+:8080/";

Теперь нам нужно определить, какую страницу хочет получить клиент и вернуть ему её в качестве ответа сервера.

switch(request.RawUrl)
{
case "/auto":
case "/hello":
case "/say": buffer = File.ReadAllBytes("../../mysite" + request.RawUrl + ".html"); break;
default: buffer = File.ReadAllBytes("../../mysite/default.html"); break;
}

Адрес запрашиваемого ресурса можно получить с помощью свойства RawUrl объекта request.

С помощью метода ReadAllBytes считываем содержимое html файла и преобразуем его в массив байт для последующей отправки клиенту.

Если клиент запрашивает не существующую страницу, то ему будет возвращаться содержимое страницы default.html, которую необходимо вручную создать и добавить в хранилище сайтов.

Что получилось в итоге:

private void button1_Click(object sender, EventArgs e)
{
string uri = @"http://+:8080/";
StartServer(uri);
}
private void StartServer(string prefix)
{
byte[] buffer;
HttpListener server = new HttpListener();
server.Prefixes.Add(prefix);
server.Start();
this.Text = "Сервер запущен!";
while (server.IsListening)
{
HttpListenerContext context = server.GetContext();
HttpListenerRequest request = context.Request;
HttpListenerResponse response = context.Response;
response.ContentType = "text/html; charset=UTF8";
switch(request.RawUrl)
{
case "/auto":
case "/hello":
case "/say": buffer = File.ReadAllBytes("../../mysite" + request.RawUrl + ".html"); break;
default: buffer = File.ReadAllBytes("../../mysite/default.html"); break;
}
response.ContentLength64 = buffer.Length;
using (Stream output = response.OutputStream)
{
output.Write(buffer, 0, buffer.Length);
}
}
}

Запуск веб-сервера

Запускаем веб-сервер после чего на клиенте, в адресной строке веб-браузера, вводим адрес ресурса, например:

http://192.168.10.1:8080/auto

браузер

Также можно ввести адрес несуществующей страницы и убедится, что сервер возвращает клиенту содержимое страницы default.html.

Читайте также:

Leave a Reply

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*