¿Cómo consigo que el servidor web de Kestrel escuche solicitudes que no sean de host local?

82

Implementé mi aplicación c #, asp.net 5, mvc 6 en un servidor de Windows 2008. Me encendí dnx weby está escuchando el puerto 5000 y funciona bien cuando accedo desde la computadora local.

¿Cómo consigo que escuche solicitudes que no sean de localhost?

PD: Esta pregunta no es un duplicado de esto ... se refiere a asp.net pre RC1 cuando hosting.ini en realidad tenía un formato .ini. Ahora, es JSON y no puedo encontrar ninguna documentación sobre lo que realmente debería estar en él.

PPS La verdadera solución está en la respuesta no aceptada a la pregunta vinculada, con una advertencia masiva. Pasos:

  1. Cambie su project.json según la respuesta vinculada.
  2. Publique su proyecto en su servidor.
  3. En el servidor, vaya a la carpeta ... \ Approot \ src \ YourProject y abra una ventana de comandos allí.
  4. Corre dnx web- fallará
  5. correr dnu restore
  6. Ejecuta 'dnu build'
  7. Ejecute 'dnx web`: el servidor web ahora debería comenzar bien

PD Para las personas que votan a favor de esta pregunta. Está desactualizado. ¡Muy desactualizado!

Se aplicó a las primeras versiones de .NET Core. La pregunta y las respuestas ciertamente no son aplicables para las versiones actuales del marco (por ejemplo, 2.x, 3.x)

AngryHacker
fuente
Posible duplicado de ASP.NET 5 Kestrel connect dentro de LAN
chue x
Bueno, la segunda respuesta en la pregunta vinculada se refiere al formato JSON. ¿Tampoco te sirve?
chue x
@chuex Lo intenté e inicialmente bloqueó el servidor web al inicio. No estoy seguro de por qué. Luego lo hice dnu restore, seguido dnu buildy luego dnx webinicié correctamente el servidor web. No sé por qué está sucediendo, pero al menos puedo hacer que funcione. Definitivamente hay un error que debe solucionarse antes del lanzamiento final. Por ahora, esta es la solución.
AngryHacker
1
Edité por pregunta para reflejar la solución.
AngryHacker
@AngryHacker: puede especificar un server.urlsparámetro en el archivo de configuración de la aplicación o en los parámetros de la línea de comandos. El valor puede tener varios valores separados por punto y coma, consulte aquí . El nombre del archivo de configuración puede ser hosting.json , pero no solo puede ser json: vea el problema . --configse puede utilizar para especificar el nombre del archivo de configuración
Oleg

Respuestas:

114

El archivo de configuración predeterminado que utiliza el servidor Kestrel es hosting.json. El nombre se cambió varias veces en diferentes versiones beta. Si usa ahora project.jsoncon la siguiente "command"sección

"commands": {
    "web": "Microsoft.AspNet.Server.Kestrel"
}

luego, durante el inicio del servidor desde la línea de comando,

dnx web

hosting.jsonse leerá el archivo . El archivo

{
    "server.urls": "http://0.0.0.0:5000"
}

configurará el servidor para escuchar 5000 en cada dirección IP4. La configuración

{
    "server.urls": "http://::5000;http://0.0.0.0:5000"
}

informará para escuchar 5000 en direcciones IP4 e IP6.

Se pueden especificar archivos de configuración alternativos por ASPNET_ENVvariable de entorno de uso o por el uso de--config myconfig1.json (o config=myconfig1.json). Por ejemplo, puede utilizar

SET ASPNET_ENV=Development

y para crear hosting.Development.json archivo con configuración específica. Alternativamente, puede usar project.jsoncon

"commands": {
    "web": "Microsoft.AspNet.Server.Kestrel"
    "webProd": "Microsoft.AspNet.Server.Kestrel --config prod.json"
}

e inicie el servidor por uso

dnx webProd

Debo recordar, además, que podría ser necesario que permitas escuchar y registrarte adicionalmente (para empezar dnx web ) . Es necesario debido al firewall y la seguridad local de escuchar nuevos puertos TCP / HTTP. Algo como a continuación debería hacer que el registro y la escucha local del puerto 5000 para todos (IPv4 e IPv6):

netsh http add iplisten ipaddress=0.0.0.0:5000
netsh http add iplisten ipaddress=::5000
netsh http add urlacl url=http://+:5000/ user=\Everyone

Para estar más seguro, puede ajustar la configuración anterior para otorgar derechos mínimos.

ACTUALIZADO: Gracias @BlaneBunderson. Se puede usar * en lugar de la dirección IP (como http://*:5000) para escuchar cualquier dirección IP4 e IP6 desde cualquier interfaz. Uno debe tener cuidado y no usar estos

  • http://*:5000;http://::5000
  • http://::5000;http://*:5000
  • http://*:5000;http://0.0.0.0:5000
  • http://*:5000;http://0.0.0.0:5000

porque requerirá registrar la dirección IP6 ::o la dirección IP4 0.0.0.0 dos veces .

Corresponde al anuncio

Técnicamente, cualquier nombre de host que no sea "localhost" o una dirección IPv4 o IPv6 válida hará que Kestrel se vincule a todas las interfaces de red.

Creo que el comportamiento podría cambiarse en el futuro. Por lo tanto yo recomendaría usar sólo *:5000, 0.0.0.0:5000y el ::5000formulario para el registro de cualquier dirección de TI.

ACTUALIZADO 2: ASP.NET Core RC2 cambia (ver el anuncio ) el comportamiento de carga de los valores predeterminados. Uno tiene que hacer cambios en el Mainpara cargar la configuración hosting.jsony los parámetros de la línea de comando. A continuación se muestra un ejemplo del uso

public static void Main(string[] args)
{
    var config = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("hosting.json", optional: true)
        .AddEnvironmentVariables(prefix: "ASPNETCORE_")
        .AddCommandLine(args)
        .Build();

    var host = new WebHostBuilder()
        .UseUrls("http://*:1000", "https://*:1234", "http://0.0.0.0:5000")
        .UseEnvironment("Development")
        .UseConfiguration(config)
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseIISIntegration()
        .UseStartup<Startup>()
        .Build();

    host.Run();
}

El código de uso por encima de tres fijaciones: "http://*:1000", "https://*:1234", "http://0.0.0.0:5000"por defecto en lugar del uso del puerto por defecto 5000 por defecto (para ser exactos el uso de http://localhost:5000). La llamada de .UseConfiguration(config)se hace después .UseUrls . Por lo tanto, la configuración cargada desde hosting.jsono la línea de comando sobrescribe las opciones predeterminadas. Si elimina una .SetBasePath(Directory.GetCurrentDirectory())línea, entonces elhosting.json , se cargará desde el mismo directorio donde se compilará la dll de la aplicación (por ejemplo bin\Debug\netcoreapp1.0).

Uno puede usar la ejecución como

dotnet.exe run --server.urls=http://0.0.0.0:5000

para sobrescribir la configuración predeterminada (desde UseUrls) y la configuración de la "server.urls"propiedad dehosting.json si existe.

De la misma manera, se podría sobrescribir la configuración de ULR estableciendo la variable de entorno

set ASPNETCORE_SERVER.URLS=http://localhost:12541/

entonces, el inicio predeterminado de la aplicación dotnet.exe runse utilizará http://localhost:12541/para el enlace.

Aquí puede encontrar un ejemplo del uso del enlace HTTPS.

OBSERVACIÓN: El nombre de la variable de entorno se cambia de ASPNETCORE_SERVER.URLSa ASPNETCORE_URLSen versiones posteriores de ASP.NET (consulte aquí la documentación de ASP.NET Core 3.1).

Oleg
fuente
1
Además puedes usar "server.urls": "http: // *: 5000" en lugar de "server.urls": " 0.0.0.0:5000 " (Personalmente creo que el * tiene un poco más de sentido.)
Blane Bunderson
@BlaneBunderson: ¡Gracias por tu sugerencia! Tengo que añadir que http://*:5000es lo mismo http://::5000;http://0.0.0.0:5000y no http://0.0.0.0:5000. Obliga a escuchar tanto IPv4 como IPv6. Puede verificarlo por uso http://*:5000;http://::5000o http://::5000;http://*:5000. Se obtiene el error "Microsoft.AspNet.Server.Kestrel.Networking.UvException: Error -4091 La dirección EADDRINUSE ya está en uso" durante el registro de la segunda dirección. En algunos escenarios, el registro de IPv4 e IPv6 es bueno, en otros escenarios no es bueno. De cualquier forma es bueno mencionar el camino.
Oleg
Excelente actualización para RC2, gracias por la explicación detallada
Trygve
no .UseStartup<Startup>()anularía .UseConfiguration(config)en su ejemplo de "actualización 2"?
nicks
hay un error tipográfico en esa variable de entorno, debería ser ASPNETCORE_URLS
nrjohnstone
33

En RC2, la sección de comandos de project.json ya no se usa. Todavía no he conseguido que Kestrel recoja el hosting.json, pero puede configurar programáticamente el puerto en el Main de la aplicación donde se crea y configura el nuevo WebHostBuilder. Simplemente agregue el método .UseUrls () como en la muestra a continuación

    public static void Main(string[] args)
    {
        var host = new WebHostBuilder()
            .UseUrls("http://0.0.0.0:5000/")
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseIISIntegration()
            .UseStartup<Startup>()
            .Build();

        host.Run();
    }
Trygve
fuente
3
Esta fue una gran ayuda. En su .UseUrls("http://*:5000")lugar, usé un puerto reenviado 5000 con una IP de host vacía en VirtualBox, y finalmente puedo acceder a los puntos finales de .NET Core alojados en Docker desde mi Mac. ¡Dulce!
Mark Larter
Para obtener información sobre el uso de hosting.json en RC2 y una explicación más detallada, lea la respuesta de Oleg anterior, especialmente "Actualizado 2"
Trygve
2
También se aplica a 1.0.0-preview2-003121, imagen acoplable
linquize
18

Si usa asp.net core 2.1 +, modifique la sección de configuración en appsettings.json.

"Kestrel": {
  "EndPoints": {
    "Http": {
      "Url": "http://0.0.0.0:5002"
    }
  }
},
menxin
fuente
Este también me ha funcionado constantemente cuando se ejecuta desde VS Code o Visual Studio para Mac. ASPNETCORE_URLSno funcionó para mí
JSancho
10

Si está intentando colocar una aplicación ASP.NET Core dentro de un contenedor de ventana acoplable (que era mi caso de uso para tener que escuchar direcciones que no son de host local), tenga en cuenta que este caso de uso ya lo ha preparado Microsoft. Puede ver toda la gloria en https://hub.docker.com/r/microsoft/aspnetcore/

En la actualidad (v1.0.1), la magia clave para resolver este problema es que el Dockerfile de origen contiene una configuración de variable de entorno de URL, y la aplicación no intenta anular esto. (De hecho, una aplicación en contenedores debe hacer una afirmación interna lo menos posible sobre el entorno donde se ejecutará).

ENV ASPNETCORE_URLS http://+:80

Tenga en cuenta el signo más en lugar del asterisco. De hecho, recomiendo visitar el enlace de dockerhub anterior en lugar de leer mi respuesta mientras el enlace sea bueno. La versión 1.1 está a la vuelta de la esquina y las cosas pueden volver a cambiar en el futuro.

Al ejecutar el contenedor, asegúrese de exponer el puerto de invitado 80, según la configuración de la variable de entorno. Por ejemplo:

docker run -d -p 8000:80 myapp
curl localhost:8000
GrandOpener
fuente
1
Este también fue mi caso de uso y el enlace fue extremadamente útil. Gracias.
Oxymoron
3

Para AspNetCore 3.1+ simplemente agregue la siguiente línea en el archivo appsettings.json:

"Urls": "http://*:80"
Ludovic Feltz
fuente
1
Funciona de maravilla. No puedo encontrar por qué las soluciones con hosting.jsonno funcionan aunque.
Machado
0

Establezca la variable de entorno ASPNETCORE_URLSen http://0.0.0.0:5000/.

Si se ejecuta desde Visual Studio, agrega la variable de entorno desde la pestaña Depurar de las propiedades del proyecto.

Edward Brey
fuente