我如何让红帽网页服务器收听非本地主机的请求?
我已经将我的c#,asp.net 5,mvc 6应用程序部署到了Windows 2008服务器。 我已经启动了dnx web
,它正在监听端口5000,从本地计算机访问时工作正常。
我如何获得它听非本地主机的请求?
PS这个问题不是这个的重复…它指的是asp.net pre RC1当hosting.ini实际上有一个.ini格式。 现在,这是JSON,我不能find任何文件实际上应该在其中。
PPS真正的解决scheme是对被链接的问题的不被接受的答案 ,这是一个巨大的警告。 脚步:
- 改变你的project.json每个链接的答案。
- 将您的项目发布到您的服务器。
- 在服务器上,转到… \ approot \ src \ YourProject文件夹并在那里打开一个命令窗口。
- 运行
dnx web
– 它会失败 - 运行
dnu restore
- 运行“dnu build”
- 运行“DNXnetworking” – networking服务器现在应该开始罚款
Kestrel服务器使用的默认configuration文件是hosting.json
。 该名称在不同的testing版本中被多次更改。 如果您现在使用project.json
和下面的"command"
部分
"commands": { "web": "Microsoft.AspNet.Server.Kestrel" }
然后在从命令行启动服务器的过程中
dnx web
文件hosting.json
将被读取。 文件
{ "server.urls": "http://0.0.0.0:5000" }
将configuration服务器在每个IP4地址上监听5000。 configuration
{ "server.urls": "http://::5000;http://0.0.0.0:5000" }
将通知监听5000的IP4和IP6地址。
可以通过使用ASPNET_ENV
环境variables或使用--config myconfig1.json
(或config=myconfig1.json
)来指定备用configuration文件。 比如你可以使用
SET ASPNET_ENV=Development
并创build具有特定configuration的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端口的本地安全性所必需的。 像下面的东西应该为每个人做本地注册和监听5000端口(IPv4和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
为了更安全,您可以调整上述configuration以授予最小权限。
更新:谢谢@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
两次 。
对应于公告
从技术上讲,任何不是“本地主机”或有效的IPv4或IPv6地址的主机名都将导致Kestrel绑定到所有networking接口。
我认为这种行为在将来可能会改变。 因此,我build议只使用*:5000
0.0.0.0:5000
*:5000
和::5000
格式来注册任何IT地址。
更新2: ASP.NET Core RC2更改(请参阅公告 )加载默认值的行为。 必须在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
之后 .UseUrls
。 因此,从hosting.json
或命令行加载的configuration将覆盖默认选项。 如果删除.SetBasePath(Directory.GetCurrentDirectory())
行,那么.SetBasePath(Directory.GetCurrentDirectory())
将从应用程序dll将被编译的目录(例如bin\Debug\netcoreapp1.0
) bin\Debug\netcoreapp1.0
。
可以使用像执行
dotnet.exe run --server.urls=http://0.0.0.0:5000
如果存在,则覆盖来自UseUrls
的默认设置(来自UseUrls
)和来自"server.urls"
属性的设置。
用同样的方法可以通过设置环境variables来覆盖ULR设置
set ASPNETCORE_SERVER.URLS=http://localhost:12541/
那么使用dotnet.exe run
应用程序的默认启动将使用http://localhost:12541/
进行绑定。
你可以在这里find一个使用HTTPS绑定的例子。
在RC2中,project.json的命令部分不再使用。 我还没有得到Kestrel拿起hosting.json,但你可以编程设置新的WebHostBuilder创build和configuration的应用程序的主要端口。 只需添加.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环境variables设置,应用程序不会试图覆盖这个。 (事实上,一个集装箱化的应用程序应该尽可能less地说明它将运行的环境。)
ENV ASPNETCORE_URLS http://+:80
注意加号而不是星号。 其实我build议访问上面的dockerhub链接只要阅读我的答案链接是好的。 版本1.1即将到来,事情可能在未来再次发生变化。
运行容器时,请确保根据环境variables设置显示访客端口80。 例如:
docker run -d -p 8000:80 myapp curl localhost:8000