Búsqueda de sitios web

Ejecución del servidor web HTTP simple con PowerShell


Para fines de prueba o como un simple código auxiliar en la etapa de implementación del servicio, regularmente necesito ejecutar un servidor web simple en Windows. Para evitar una instalación completa de IIS, puede ejecutar un servidor web HTTP simple directamente desde su consola de PowerShell. Puede ejecutar dicho servidor web en cualquier puerto TCP utilizando la clase System.Net.HttpListener.NET integrada.

Abra su consola de PowerShell y cree un agente de escucha HTTP:

$httpListener = New-Object System.Net.HttpListener

Luego especifique el puerto para escuchar. En este ejemplo, quiero ejecutar un servidor web HTTP en el puerto 9090.

$httpListener.Prefixes.Add("http://localhost:9090/")
  • Asegúrese de que este puerto no esté siendo utilizado por otros procesos. Puede averiguar qué proceso está escuchando en un TCP o UDP en Windows.

  • Para escuchar en todas las interfaces de red, utilice el

    http://+:9090/

    DIRECCIÓN.

Inicie el oyente:

$httpListener.Start()

Puede usar diferentes tipos de autenticación (Básico, Digest, Windows, Negociar o NTLM) en su objeto HttpListener o vincular un certificado SSL para implementar HTTPS.

Si ejecuta este código, aparece un proceso separado en espera de conexión en el puerto 9090 en Windows. Compruébalo usando el comando:

nestat -na 9090

o mostrar una lista de puertos abiertos usando PowerShell:

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

Recuerde abrir este puerto en el Firewall de Windows Defender. Puede crear rápidamente una regla para abrir un puerto de firewall mediante el comando de PowerShell:

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

Ahora cree un archivo de texto en su disco duro con el HTML que desea que muestre su servidor web. Por ejemplo:

<!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>

Guardé este código HTML en C:\PS estwebpage.html con codificación UTM-8.

Luego ejecute los siguientes comandos para leer su archivo HTML y enviar una respuesta al navegador de un usuario.

$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()

Abra la dirección URL de su servidor HTTP en un navegador (

http://localhost:9090

) o use PowerShell para obtener el contenido de una página web. El script devuelve un código HTML solo una vez, después de lo cual su oyente se detendrá automáticamente (solo se procesa una solicitud de usuario).

Libera el puerto TCP:

$httpListener.Close()

Si desea que el servidor HTTP siga devolviendo su página, debe agregar el código de PowerShell al bucle. El siguiente ejemplo inicia un servidor HTTP en un bucle que finaliza cuando se presiona cualquier tecla en la consola de 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()

Un servidor HTTP de PowerShell permanece activo hasta que cierra la consola de PowerShell o finaliza la sesión mediante el

.Close

método.

Puede ejecutar este script de PowerShell como un servicio de Windows.

Puede ejecutar un servidor web tan liviano en cualquier host de Windows sin servicios de información de Internet u otra instalación de software de terceros. No se requieren privilegios de administrador. Puede usar este HTTPListener como un servidor REST simple o para obtener información de una computadora remota a través de HTTP.

Artículos relacionados