我已经将我的c#,asp.net 5,mvc 6应用程序部署到了Windows 2008服务器上。我已经启动了dnx web
并且正在侦听端口5000并且从本地计算机访问时工作正常。
如何让它听取非本地主机请求?
附:这个question不是这个的重复...当hosting.ini实际上有一个.ini格式时,它指的是asp.net pre RC1。现在,它是JSON,我找不到任何实际应该包含在其中的文档。
P.P.S.真正的解决方案是在未被接受的answer到相关问题,并提出了一个巨大的警告。脚步:
dnx web
- 它会失败dnu restore
Kestrel服务器使用的默认配置文件是hosting.json
。该名称在不同的beta版本中多次更改。如果您现在使用project.json
与以下"command"
部分
"commands": {
"web": "Microsoft.AspNet.Server.Kestrel"
}
然后在从命令行启动服务器的过程中
dnx web
将读取文件hosting.json
。文件
{
"server.urls": "http://0.0.0.0:5000"
}
将配置服务器在每个IP4地址上侦听5000。配置
{
"server.urls": "http://::5000;http://0.0.0.0:5000"
}
将通知在IP4和IP6地址上听5000。
可以通过使用ASPNET_ENV
环境变量或使用--config myconfig1.json
(或config=myconfig1.json
)来指定备用配置文件。例如,您可以使用
SET ASPNET_ENV=Development
并创建具有特定配置的hosting.Development.json
文件。或者你可以使用project.json
"commands": {
"web": "Microsoft.AspNet.Server.Kestrel"
"webProd": "Microsoft.AspNet.Server.Kestrel --config prod.json"
}
并按使用情况启动服务器
dnx webProd
我还要提醒一下,可能需要你允许另外听和注册(启动dnx web
)。这是必需的,因为防火墙和侦听新TCP / HTTP端口的本地安全性。下面的内容应该为每个人(IPv4和IPv6)本地注册和监听5000端口:
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
为了更安全,您可以调整上述配置以授予最小权限。
更新:谢谢@BlaneBunderson。可以使用*代替IP地址(如http://*:5000
)从任何接口监听任何IP4和IP6地址。一个应该小心,不要使用http://*:5000;http://::5000
,http://::5000;http://*:5000
,http://*:5000;http://0.0.0.0:5000
或http://*:5000;http://0.0.0.0:5000
,因为它需要注册IP6地址::
或IP4地址0.0.0.0
两次。
从技术上讲,任何不是“localhost”或有效IPv4或IPv6地址的主机名都会导致Kestrel绑定到所有网络接口。
我认为将来可能会改变这种行为。因此,我建议仅使用*:5000
,0.0.0.0:5000
和::5000
表格来注册任何IT地址。
更新2:ASP.NET Core RC2更改(请参阅the announcement)加载默认值的行为。必须在Main
中进行更改才能从hosting.json
和命令行参数加载设置。以下是使用示例
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();
}
上面的代码默认使用三个绑定:"http://*:1000"
,"https://*:1234"
,"http://0.0.0.0:5000"
,而不是默认使用默认端口5000(确切地说是http://localhost:5000
的用法)。 .UseConfiguration(config)
的召唤是在.UseUrls
之后发出的。因此,从hosting.json
或命令行加载的配置会覆盖默认选项。如果删除.SetBasePath(Directory.GetCurrentDirectory())
行,那么hosting.json
将从编译应用程序dll的同一目录中加载(例如bin\Debug\netcoreapp1.0
)。
人们可以使用像
dotnet.exe run --server.urls=http://0.0.0.0:5000
覆盖默认设置(来自UseUrls
)和"server.urls"
的hosting.json
属性的设置(如果它存在)。
以同样的方式,可以通过设置环境变量来覆盖ULR设置
set ASPNETCORE_SERVER.URLS=http://localhost:12541/
那么使用dotnet.exe run
的应用程序的默认启动将使用http://localhost:12541/
进行绑定。
您可以在here中找到HTTPS绑定用法的示例。
在RC2中,不再使用project.json的命令部分。我还没有得到Kestrel来接收hosting.json,但是您可以以编程方式在创建和配置新WebHostBuilder的应用程序的Main中设置端口。只需添加.UseUrls()方法,如下面的示例所示
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();
}
如果您尝试将ASP.NET Core应用程序放在docker容器中(这是我需要监听非本地主机地址的用例),请注意Microsoft已经为您提供了这个用例。你可以在https://hub.docker.com/r/microsoft/aspnetcore/看到完整的荣耀
在当前(v1.0.1),解决此问题的关键魔法是源Dockerfile包含url环境变量设置,并且应用程序不会尝试覆盖它。 (实际上,容器化应用程序应该在内部尽可能少地声明它将运行的环境。)
ENV ASPNETCORE_URLS http://+:80
注意那里的加号而不是星号。我实际上建议访问上面的dockerhub链接阅读我的答案,只要链接是好的。版本1.1即将来临,未来可能会再次发生变化。
运行容器时,请确保根据环境变量设置公开guest虚拟机端口80。例如:
docker run -d -p 8000:80 myapp
curl localhost:8000
如果您使用asp.net core 2.1 +,请修改appsettings.json中的config部分。
"Kestrel": {
"EndPoints": {
"Http": {
"Url": "http://0.0.0.0:5002"
}
}
},