如何使Kestrel Web服务器监听非本地主机的请求?


82

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

如何获取它以侦听非本地主机的请求?

PS此问题不是此问题的重复... hosting.ini实际上具有.ini格式时,它指的是RC1之前的asp.net。现在,它是JSON,我找不到任何有关它实际内容的文档。

PPS真正的解决方案是对链接的问题的不可接受的回答,其中有很多警告。脚步:

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

PS对于支持此问题的人。过时了 非常严重的过时了!

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



好吧,链接问题中的第二个答案指的是JSON格式。这对您也没有用吗?
chu x

@chuex我尝试过,最初它在启动时使Web服务器崩溃。不知道为什么。然后我做了dnu restore,接着是dnu build然后dnx web正确启动了Web服务器。我不知道它为什么会发生,但是至少我能够使它起作用。最终发行之前肯定有一个错误需要解决。目前,这是解决方法。
AngryHacker 2015年

1
我按问题进行编辑以反映解决方案。
AngryHacker 2015年

@AngryHacker:您可以server.urls在应用程序配置文件或命令行参数中指定参数。该值可以有多个分号分隔的值,请参见此处。配置的文件名可以是hosting.json,但不仅可以是json:请参见问题--config可以用来指定配置文件名
Oleg

Answers:


114

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绑定到所有网络接口。

我认为这种行为将来可能会改变。因此,我建议只使用*: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)。的呼叫.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

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

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

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

然后使用的应用程序的默认启动dotnet.exe runhttp://localhost:12541/用于绑定。

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

备注:在ASP.NET的更高版本中,环境变量的名称从更改ASPNETCORE_SERVER.URLSASPNETCORE_URLS(请参见此处的ASP.NET Core 3.1文档)。


1
另外,您可以使用“ server.urls”:“ http:// *:5000”代替“ server.urls”:“ 0.0.0.0:5000 ”(我个人认为*更具意义。)
Blane Bunderson 2015年

@BlaneBunderson:谢谢你的建议!我必须补充一点 http://*:5000,这与http://::5000;http://0.0.0.0:5000and相同http://0.0.0.0:5000。它强制侦听IPv4和IPv6。您可以通过用法http://*:5000;http://::5000或验证它http://::5000;http://*:5000。一个在注册第二个地址时收到错误“ Microsoft.AspNet.Server.Kestrel.Networking.UvException:错误-4091 EADDRINUSE地址已在使用”。在某些情况下,同时注册IPv4和IPv6是好的,在其他情况下则不好。无论如何,最好提一下方式。
奥列格

RC2的出色更新,感谢您的详细解释
Trygve

不会在您的“更新2”示例中.UseStartup<Startup>()覆盖.UseConfiguration(config)
尼克斯

该环境变量中有一个错字,应该是ASPNETCORE_URLS
nrjohnstone

33

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

3
这是一个很大的帮助。我.UseUrls("http://*:5000")改用了端口,并在VirtualBox上使用空的主机IP端口转发了5000,最后我可以从Mac转到Docker托管的.NET Core端点。甜!
Mark Larter

有关在RC2中使用hosting.json的信息以及更详细的解释,请阅读上面的Oleg的回答,尤其是“ Updated 2”
Trygve

2
也适用于1.0.0-preview2-003121,docker映像
linquize '16

18

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

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

从VS Code或Visual Studio for Mac运行时,该代码也一直为我工作。 ASPNETCORE_URLS不适用于我
JSancho

9

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

1
这也是我的用例,链接非常有帮助。谢谢。
Oxymoron


0

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.