c# - usekestrel - ¿Cómo hago para que el servidor web de Kestrel escuche solicitudes que no son de host local?
que es kestrel (4)
El archivo de configuración predeterminado utilizado por el servidor Kestrel es
hosting.json
.
El nombre fue cambiado varias veces en diferentes versiones beta.
Si usa ahora
project.json
con la siguiente sección de
"command"
"commands": {
"web": "Microsoft.AspNet.Server.Kestrel"
}
luego, durante el inicio del servidor desde la línea de comandos
dnx web
se leerá el archivo
hosting.json
.
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 ambas direcciones IP4 e IP6.
Se pueden especificar archivos de configuración alternativos mediante el uso de la variable de entorno
ASPNET_ENV
o mediante el uso de
--config myconfig1.json
(o
config=myconfig1.json
).
Por ejemplo, puedes usar
SET ASPNET_ENV=Development
y para crear el archivo
hosting.Development.json
con una configuración específica.
Alternativamente, puede usar
project.json
con
"commands": {
"web": "Microsoft.AspNet.Server.Kestrel"
"webProd": "Microsoft.AspNet.Server.Kestrel --config prod.json"
}
e iniciar el servidor por uso
dnx webProd
Debo recordar además que podría ser necesario que permitas escuchar y registrarte adicionalmente (para iniciar
dnx web
).
Se requiere debido al firewall y la seguridad local de escuchar nuevos puertos TCP / HTTP.
Algo como a continuación debería hacer que el registro local y la escucha de 5000 puertos 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.
Se debe tener cuidado y no usar
http://*:5000;http://::5000
,
http://::5000;http://*:5000
,
http://*:5000;http://0.0.0.0:5000
o
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 una a todas las interfaces de red.
Creo que el comportamiento podría cambiarse en el futuro.
Por lo tanto, recomendaría usar solo
*:5000
,
0.0.0.0:5000
y
::5000
para registrar cualquier dirección de TI.
ACTUALIZADO 2:
ASP.NET Core RC2 cambia (vea
el anuncio
) el comportamiento de cargar los valores predeterminados.
Hay que hacer cambios en el
Main
para cargar la configuración de
hosting.json
y los parámetros de la línea de comandos.
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 anterior utiliza tres enlaces:
"http://*:1000"
,
"https://*:1234"
,
"http://0.0.0.0:5000"
de forma predeterminada en lugar de usar el puerto predeterminado 5000 de forma predeterminada ( para ser exactos el uso de
http://localhost:5000
).
La llamada a
.UseConfiguration(config)
se realiza
después de
.UseUrls
.
Por lo tanto, la configuración cargada desde
hosting.json
o la línea de comando sobrescribe las opciones predeterminadas.
Si se elimina la línea
.SetBasePath(Directory.GetCurrentDirectory())
, el
hosting.json
se cargará desde el mismo directorio donde se compilará la aplicación dll (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 (de
UseUrls
) y la configuración de la propiedad
"server.urls"
de
hosting.json
si existe.
Del mismo modo, se podría sobrescribir la configuración de ULR configurando la variable de entorno
set ASPNETCORE_SERVER.URLS=http://localhost:12541/
entonces el inicio predeterminado de la aplicación que utiliza
dotnet.exe run
http://localhost:12541/
para el enlace.
Puede encontrar here un ejemplo del uso del enlace HTTPS.
Implementé mi aplicación c #, asp.net 5, mvc 6 en un servidor Windows 2008.
He encendido
dnx web
y está escuchando el puerto 5000 y funciona bien cuando accedo desde una computadora local.
¿Cómo consigo que escuche las solicitudes no locales de host?
PD Esta question no es un duplicado de esto ... se refiere a asp.net pre RC1 cuando hosting.ini realmente 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 solución real está en la answer no aceptada a la pregunta vinculada, con una advertencia masiva. Pasos:
- Cambie su project.json por la respuesta vinculada.
- Publique su proyecto en su servidor.
- En el servidor, vaya a la carpeta ... / approot / src / YourProject y abra una ventana de comandos allí.
-
Ejecute
dnx web
: fallará -
Ejecutar
dnu restore
- Ejecute ''dnu build`
- Ejecute ''dnx web`: el servidor web ahora debería comenzar bien
En RC2, la sección de comandos de project.json ya no se usa. Todavía no he conseguido que Kestrel recoja hosting.json, pero puede configurar programáticamente el puerto en Main de la aplicación donde se crea y configura el nuevo WebHostBuilder. Simplemente agregue el método .UseUrls () como en el ejemplo 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();
}
Si está tratando de poner una aplicación ASP.NET Core dentro de un contenedor acoplable (que fue mi caso de uso para tener que escuchar direcciones que no son de host local), tenga en cuenta que Microsoft ya ha preparado este caso de uso. 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 url, y la aplicación no intenta anular esto. (De hecho, una aplicación en contenedor debería afirmar internamente lo menos posible sobre el entorno donde se ejecutará).
ENV ASPNETCORE_URLS http://+:80
Tenga en cuenta el signo más en lugar de un asterisco allí. De hecho, recomiendo visitar el enlace dockerhub anterior antes de leer mi respuesta siempre que el enlace sea bueno. La versión 1.1 está a la vuelta de la esquina, y las cosas pueden cambiar nuevamente en el futuro.
Al ejecutar el contenedor, asegúrese de exponer el puerto invitado 80, según la configuración de la variable de entorno. Por ejemplo:
docker run -d -p 8000:80 myapp
curl localhost:8000
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"
}
}
},