【问题标题】:How to use domain url with kestrel in Asp.Net core app?如何在 Asp.Net 核心应用程序中将域 url 与红隼一起使用?
【发布时间】:2019-12-05 11:35:31
【问题描述】:

我在windows 操作系统中有一个带有asp.net core 2.2 的项目。

我部署项目并使用kesterl 运行此命令:

dotnet myapp.dll

http://localhost:5000 中运行。

我需要在mydomain.com运行网站。

我在主机中为127.0.0.1 ip 设置了mydomain.com

如何设置这个配置?

【问题讨论】:

    标签: asp.net-core .net-core asp.net-core-2.2 kestrel


    【解决方案1】:

    当您直接通过 Kestrel 运行 ASP.NET Core 应用程序时,无需额外的反向代理(如 IIS 或 nginx),您需要正确配置托管 URL。文档的endpoint configuration chapter 中详细描述了几个选项:

    默认情况下,ASP.NET Core 绑定到:

    使用以下命令指定 URL:

    • ASPNETCORE_URLS 环境变量。
    • --urls 命令行参数。
    • urls 主机配置密钥。
    • UseUrls 扩展方法。

    一个非常常见的解决方案是更改环境变量。这允许您以非常灵活的方式设置 URL,这对于快速启动应用程序非常有用。从命令行启动服务器时,可能如下所示:

    # PowerShell
    PS> $env:ASPNETCORE_URLS = 'http://example.com'
    PS> dotnet myapp.dll
    
    # cmd
    > set ASPNETCORE_URLS=http://example.com
    > dotnet myapp.dll
    
    # bash
    $ ASPNETCORE_URLS=http://example.com dotnet myapp.dll
    

    更永久(但仍然灵活)的解决方案是将 Kestrel 配置指定为 appsettings.json 文件的一部分。如果您想通过 HTTPS 托管,这还允许您配置 HTTPS 证书。

    这可能看起来像这样:

    {
      "Kestrel": {
        "Endpoints": {
          "Http": {
            "Url": "http://example.com"
          },
          "Https": {
            "Url": "https://example.com",
            "Certificate": {
              "Path": "<path to .pfx file>",
              "Password": "<certificate password>"
            }
          }
        }
      }
    }
    

    有关更多详细信息,请查看hosting with Kestrel 上的文档。

    如果您想将应用程序托管在一个公共端口上,您应该记住,只能有一个进程在侦听一个端口。因此,如果您有一些其他应用程序已经在侦听端口 80 和 443,您将无法在这些端口上使用 Kestrel 托管您的应用程序。这是仅使用 Kestrel 的托管模型的限制,因为每个应用程序都是一个单独的进程。相比之下,通过 IIS 或 nginx 等反向代理托管,您可以在同一个端口上托管多个应用程序,因为侦听这些端口的是反向代理进程。

    【讨论】:

    • 感谢关注。我之前测试过这个方法(appsettings.json)并且我已经改变了默认端口,但是当我在appsetting.json中设置http://mydomain并运行myapp.dll时遇到access permissions错误:crit: Microsoft.AspNetCore.Server.Kestrel[0] Unable to start Kestrel. System.Net.Sockets.SocketException (10013): An attempt was made to access a socket in a way forbidden by its access permissions
    • 如果您想在某些端口上托管,例如端口 80,您将需要管理员访问权限。所以你必须以管理员身份运行你的应用程序。
    • 感谢@poke,我找到了问题的原因。问题是因为,我没有在kesterl 网络服务器中关注Port sharing limitation。无论如何,我会给你投赞成票。我正在编辑你的答案。
    猜你喜欢
    • 2022-01-11
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    • 2018-07-17
    • 1970-01-01
    • 2020-08-07
    相关资源
    最近更新 更多