如何让红隼网络服务器监听非本地主机请求?

Posted

技术标签:

【中文标题】如何让红隼网络服务器监听非本地主机请求?【英文标题】: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,并带有大量警告。步骤:

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

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

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

【问题讨论】:

ASP.NET 5 Kestrel connect within LAN的可能重复 那么链接问题中的第二个答案是指 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 标准。非常有帮助! 【参考方案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 运行,则从项目属性的“调试”选项卡中添加环境变量。

【讨论】:

以上是关于如何让红隼网络服务器监听非本地主机请求?的主要内容,如果未能解决你的问题,请参考以下文章

oracle如何配置监听

fiddler怎么不监听本机的网络请求

Java网络基础

Oracle:浅析监听器安装/配置入门

vc 6.0连接oracle11g

Java 网络编程 网络基础知识