93

我已将我的 c#、asp.net 5、mvc 6 应用程序部署到 Windows 2008 服务器。我已经启动dnx web,它正在侦听端口 5000,并且在从本地计算机访问时工作正常。

如何让它监听非本地主机请求?

PS这个问题不是这个的重复......它指的是asp.net pre RC1,而hosting.ini实际上有一个.ini格式。现在,它是 JSON,我找不到任何关于其中实际内容的文档。

PPS 真正的解决方案是链接问题的不被接受的答案,并带有大量警告。脚步:

  1. 根据链接的答案更改您的 project.json。
  2. 将您的项目发布到您的服务器。
  3. 在服务器上,转到 ...\approot\src\YourProject 文件夹并在那里打开一个命令窗口。
  4. 运行dnx web- 它会失败
  5. dnu restore
  6. 运行“dnu 构建”
  7. 运行“dnx web”——网络服务器现在应该可以正常启动了

PS对于支持这个问题的人。它已经过时了。非常过时!

它适用于 .NET Core 的早期版本。问题和答案当然不适用于框架的当前版本(例如 2.x、3.x)

4

6 回答 6

119

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 更改(参见公告)加载默认值的行为。必须更改以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 runhttp://localhost:12541/用于绑定。

您可以在此处找到使用 HTTPS 绑定的示例。

备注:环境变量的名称在 ASP.NET 的更高版本中由 更改ASPNETCORE_SERVER.URLS为(请参阅此处的 ASP.NET Core 3.1 文档)。ASPNETCORE_URLS

于 2015-12-11T10:47:39.007 回答
33

在 RC2 中,不再使用 project.json 的 commands 部分。我还没有让 Kestrel 获取 hosting.json,但是您可以在应用程序的 Main 中以编程方式设置端口,在该应用程序中创建和配置新的 WebHostBuilder。只需添加 .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();
    }
于 2016-05-20T14:52:12.130 回答
22

如果您使用 asp.net core 2.1+,请修改 appsettings.json 中的配置部分。

"Kestrel": {
  "EndPoints": {
    "Http": {
      "Url": "http://0.0.0.0:5002"
    }
  }
},
于 2019-04-23T07:51:53.523 回答
15

对于AspNetCore 3.1+,只需在文件中添加以下行appsettings.json

"Urls": "http://*:80"
于 2020-07-08T13:40:38.943 回答
12

如果您尝试将 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 版指日可待,未来可能会再次发生变化。

运行容器时,请确保根据环境变量设置公开访客端口 80。例如:

docker run -d -p 8000:80 myapp
curl localhost:8000
于 2016-10-25T13:45:03.630 回答
2

将环境变量设置ASPNETCORE_URLShttp://0.0.0.0:5000/.

如果从 Visual Studio 运行,则从项目属性的“调试”选项卡中添加环境变量。

于 2020-03-20T20:36:42.930 回答