如何让kestrel web服务器侦听非本地主机请求

本文关键字:主机 请求 kestrel web 服务器 | 更新日期: 2023-09-27 18:26:20

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

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

附言:这个问题不是这个问题的重复。。。它指的是asp.net之前的RC1,而hosting.ini实际上有.ini格式。现在,它是JSON,我找不到任何关于它应该包含什么的文档

附言:真正的解决方案是对相关问题的不被接受的答案,并有一个巨大的警告。步骤:

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

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

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

Kestrel服务器使用的默认配置文件是hosting.json。该名称在不同的测试版中更改了多次。如果您现在将project.json与以下"command"部分一起使用

"commands": {
    "web": "Microsoft.AspNet.Server.Kestrel"
}

然后在从命令行启动服务器的过程中

dnx web

将读取文件CCD_ 7。文件

{
    "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

并创建具有特定配置的CCD_ 11文件。或者,您可以将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地址CCD_ 19或IP4地址0.0.0.0两次

与公告相对应

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

我认为这种行为将来可以改变。因此,我建议只使用*:50000.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的用法)。CCD_ 30的调用在.UseUrls之后进行。因此,从hosting.json或命令行加载的配置会覆盖默认选项。如果删除.SetBasePath(Directory.GetCurrentDirectory())行,则hosting.json将从编译应用程序dll的同一目录加载(例如bin'Debug'netcoreapp1.0)。

可以使用类似的执行

dotnet.exe run --server.urls=http://0.0.0.0:5000

以覆盖hosting.json的默认设置(来自UseUrls)和"server.urls"属性的设置(如果存在)。

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

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

则使用CCD_ 39的应用程序的默认启动将使用http://localhost:12541/进行绑定。

您可以在这里找到HTTPS绑定的使用示例。

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

如何让kestrel web服务器侦听非本地主机请求

在RC2中,不再使用project.json的命令部分。我还没有让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();
    }

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

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

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

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

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

另一个选项是修改launchSettings.json。将"applicationUrl": "http://localhost:5000",替换为"applicationUrl": "http://0.0.0.0:5000",。像这样:

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:3031"
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "WebApplication1": {
      "commandName": "Project",
      "launchBrowser": true,
      "applicationUrl": "http://0.0.0.0:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

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

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