Запуск простого HTTP веб-сервера с помощью PowerShell

В целях тестирования или в качестве простой заглушки на этапе развертывания службы мне регулярно требуется запустить простой веб-сервер под Windows. Чтобы избежать установки полнофункционального IIS, вы можете запустить простой HTTP-веб-сервер прямо из консоли PowerShell. Такой веб-сервер можно запустить на любом TCP-порту с помощью встроенной функции System.Net.HttpListener Класс .NET.

Откройте консоль PowerShell и создайте HTTP-приемник:

$httpListener = New-Object System.Net.HttpListener

Затем укажите порт для прослушивания. В этом примере я хочу запустить веб-сервер HTTP на порту 9090.

$httpListener.Prefixes.Add("http://localhost:9090/")

  • Убедитесь, что этот порт не используется другими процессами. Вы можете узнать, какой процесс прослушивает TCP или UDP в Windows.
  • Чтобы прослушивать все сетевые интерфейсы, используйте параметр http://+:9090/ адрес.

Запустите слушателя:

$httpListener.Start()

Вы можете использовать различные типы аутентификации (Basic, Digest, Windows, Negotiate или NTLM) в своем объекте HttpListener или привязать SSL-сертификат для реализации HTTPS.

Если вы запустите этот код, в Windows появится отдельный процесс, ожидающий соединения на порту 9090. Проверьте его с помощью команды:

nestat –na 9090

или отобразить список открытых портов с помощью PowerShell:

Get-NetTCPConnection -State Listen | Select-Object -Property LocalAddress, LocalPort, State | Sort-Object LocalPort |ft

powershell: run http listenerpowershell: запустить http listener

Не забудьте открыть этот порт в брандмауэре Windows Defender. Вы можете быстро создать правило для открытия порта брандмауэра с помощью команды PowerShell:

New-NetFirewallRule -DisplayName "AllowTestWebServer" -Direction Inbound -Protocol TCP –LocalPort 9090 -Action Allow

Теперь создайте на жестком диске текстовый файл с HTML, который вы хотите отобразить на веб-сервере. Например:

<!DOCTYPE html>
<html>
<head>
<title>
Lightweight PowerShell Web Server</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
body {background-color:#ffffff;background-repeat:no-repeat;background-position:top left;background-attachment:fixed;}
h1{font-family:Arial, sans-serif;color:#000000;background-color:#ffffff;}
p {font-family:Georgia, serif;font-size:14px;font-style:normal;font-weight:normal;color:#000000;background-color:#ffffff;}
</style>
</head>
<body>
<h1>Test web page </h1>
<p>This web page was generated by PowerShell using the System.Net.HttpListener class</p>
</body>
</html>

HTML-файл для отображения на веб-сервере HTTP с помощью PowerShellHTML-файл для отображения на веб-сервере HTTP с помощью PowerShell

Я сохранил этот HTML-код в C:\PS\testwebpage.html с кодировкой UTM-8.

Затем выполните следующие команды для чтения HTML-файла и отправки ответа браузеру пользователя.

$context = $httpListener.GetContext()
$context.Response.StatusCode = 200
$context.Response.ContentType="text/HTML"
$WebContent = Get-Content  -Path "C:\PS\testwebpage.html" -Encoding UTF8
$EncodingWebContent = [Text.Encoding]::UTF8.GetBytes($WebContent)
$context.Response.OutputStream.Write($EncodingWebContent , 0, $EncodingWebContent.Length)
$context.Response.Close()

Запуск простого веб-сервера с помощью PowerShell Запуск простого веб-сервера с помощью PowerShell

Откройте URL-адрес вашего HTTP-сервера в браузере (http://localhost:9090) или используйте PowerShell для получения содержимого веб-страницы. Сценарий возвращает HTML-код только один раз, после чего ваш слушатель будет автоматически остановлен (обрабатывается только один пользовательский запрос).

Освободите TCP-порт:

$httpListener.Close()

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

write-host "Press any key to stop the HTTP listener after next request"
while (!([console]::KeyAvailable)) {
$context = $httpListener.GetContext()
$context.Response.StatusCode = 200
$context.Response.ContentType="text/HTML"
$WebContent = Get-Content -Path "C:\PS\testwebpage.html" -Encoding UTF8
$EncodingWebContent = [Text.Encoding]::UTF8.GetBytes($WebContent)
$context.Response.OutputStream.Write($EncodingWebContent , 0, $EncodingWebContent.Length)
$context.Response.Close()
Write-Output "" # Newline
}
$httpListener.Close()

HTTP-сервер PowerShell будет работать до тех пор, пока вы не закроете консоль PowerShell или не завершите сеанс с помощью команды .Close метод.

Вы можете запустить этот сценарий PowerShell в качестве службы Windows.

Такой легкий веб-сервер можно запустить на любом узле Windows без установки Internet Information Services или другого стороннего программного обеспечения. Привилегии администратора не требуются. Вы можете использовать этот HTTPListener в качестве простого REST-сервера или для получения информации с удаленного компьютера по протоколу HTTP.

Добавить комментарий

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