【问题标题】:How do I get the kestrel web server to listen to non-localhost requests?如何让红隼网络服务器监听非本地主机请求?
【发布时间】:2016-03-16 17:31:49
【问题描述】:

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

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

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

附言真正的解决方案是链接问题的不被接受的answer,并带有大量警告。步骤:

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

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

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

【问题讨论】:

  • 那么链接问题中的第二个答案是指 JSON 格式。对你也没用?
  • 我按问题编辑以反映解决方案。
  • 我知道这个问题已经被回答并标记为已解决,但我仍然在他的网络日志上找到了 Rick Strahl 的一篇很棒的帖子,名为 External Network Access to Kestrel and IIS Express in ASP.NET Core,所以我想与遇到这个问题的每个人分享问题。
  • 我读过关于过时的大信,但我绝对需要这里的回复,即使是 .NET Core 3.1 中的 Web API。我首先尝试绑定到 0.0.0.0:5000 但 IPv6 显然发生在这里,所以这不起作用。同时 [::]:5000 也不适用于外部 IPv4 访问。我不知道绑定到 *:5000 甚至是一件事,因为我们现在正在冒险脱离 IPv4/IPv6 标准。非常有帮助!

标签: c# asp.net asp.net-core dnx kestrel-http-server


【解决方案1】:

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)从任何接口监听 any 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两次

对应the announcement

从技术上讲,任何不是“localhost”或有效 IPv4 的主机名或 IPv6 地址将导致 Kestrel 绑定到所有网络接口。

我认为将来可能会改变这种行为。因此,我建议仅使用*:50000.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)和来自hosting.json"server.urls" 属性的设置(如果存在)。

同样可以通过设置环境变量来覆盖 ULR 设置

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

那么使用dotnet.exe run的应用程序默认启动将使用http://localhost:12541/进行绑定。

您可以找到here 使用 HTTPS 绑定的示例。

备注: ASP.NET 后续版本环境变量名称由ASPNETCORE_SERVER.URLS 改为ASPNETCORE_URLS(参见here ASP.NET Core 3.1 的文档)。

【讨论】:

  • 另外你可以使用 "server.urls": "http://*:5000" 而不是 "server.urls": "0.0.0.0:5000" (我个人认为 * 有点更有意义。)
  • @BlaneBunderson:感谢您的建议!我必须补充一点,http://*:5000http://::5000;http://0.0.0.0:5000 相同,而不是http://0.0.0.0:5000。它强制侦听 IPv4 和 IPv6。您可以通过使用http://*:5000;http://::5000http://::5000;http://*:5000 来验证它。一个在注册第二个地址时收到错误“Microsoft.AspNet.Server.Kestrel.Networking.UvException: Error -4091 EADDRINUSE address already in use”。在某些情况下,同时注册 IPv4 和 IPv6 是好的,在另一些情况下则不好。无论如何,提及方式是很好的。
  • RC2的优秀更新,感谢详细解释
  • 不会在您的“更新 2”示例中 .UseStartup&lt;Startup&gt;() 覆盖 .UseConfiguration(config)
  • 那个环境变量有错别字,应该是ASPNETCORE_URLS
【解决方案2】:

在 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();
    }

【讨论】:

  • 这是一个很大的帮助。我改用.UseUrls("http://*:5000"),并在VirtualBox 上使用空主机IP 转发5000 端口,最后我可以从我的Mac 访问Docker 托管的.NET Core 端点。甜!
  • 有关在 RC2 中使用 hosting.json 的信息和更详细的解释,请阅读上面 Oleg 的回答,尤其是“Updated 2”
  • 同样适用于1.0.0-preview2-003121,docker镜像
【解决方案3】:

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

"Kestrel": {
  "EndPoints": {
    "Http": {
      "Url": "http://0.0.0.0:5002"
    }
  }
},

【讨论】:

  • 从 VS Code 或 Visual Studio for Mac 运行时,这个也一直对我有用。 ASPNETCORE_URLS 对我不起作用
【解决方案4】:

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

"Urls": "http://*:80"

【讨论】:

  • 像魅力一样工作。我找不到为什么 hosting.json 的解决方案不起作用。
  • 谢谢,花了一个小时尝试从 Parallels VM 连接到我在主机 macbook 上运行的 aspnet 核心应用程序
  • 如果您通过 Visual Studio GUI(项目属性 -> 调试)执行此操作,则需要使用 http://0.0.0.0:80,而不是 *
【解决方案5】:

如果您尝试将 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

【讨论】:

  • 这也是我的用例,链接非常有用。谢谢。
【解决方案6】:

将环境变量ASPNETCORE_URLS设置为http://0.0.0.0:5000/

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

【讨论】:

    猜你喜欢
    • 2019-07-15
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-31
    • 1970-01-01
    • 2017-07-30
    相关资源
    最近更新 更多