
В целях тестирования или в качестве простой заглушки на этапе развертывания службы мне регулярно требуется запустить простой веб-сервер под 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()
Если вы запустите этот код, в Windows появится отдельный процесс, ожидающий соединения на порту 9090. Проверьте его с помощью команды:
nestat –na 9090
или отобразить список открытых портов с помощью PowerShell:
Get-NetTCPConnection -State Listen | Select-Object -Property LocalAddress, LocalPort, State | Sort-Object LocalPort |ft
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-код в 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()
Откройте 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
метод.
Такой легкий веб-сервер можно запустить на любом узле Windows без установки Internet Information Services или другого стороннего программного обеспечения. Привилегии администратора не требуются. Вы можете использовать этот HTTPListener в качестве простого REST-сервера или для получения информации с удаленного компьютера по протоколу HTTP.