繁体   English   中英

ASP.NET 核心 3.1:ConfigureAppConfiguration 是否与 launchSettings.json 交互?

[英]ASP.NET core 3.1: does ConfigureAppConfiguration interacts with launchSettings.json?

我在使用 kestrel 从 Visual Studio 2019 启动 ASP.NET 核心 3.1 web 应用程序时遇到了一种奇怪的行为(我的意思是使用 Z5DA5ACF461B4EFB7E266EC861065B21 的启动配置文件)。

我创建了一个最小的应用程序来重现该问题。

操作系统: Windows 10(内部版本 19041.746) Visual Studio 版本: Visual Studio 2019 版本 16.8.4

这是 csproj 文件:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>


</Project>

这是launchSettings.json文件:

{
  "$schema": "http://json.schemastore.org/launchsettings.json",
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:52222",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "weatherforecast",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "TestWebApplication": {
      "commandName": "Project",
      "launchBrowser": true,
      "launchUrl": "weatherforecast",
      "applicationUrl": "http://localhost:5002",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

这是 Program.cs 文件:

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;

namespace TestWebApplication
{
  public class Program
  {
    public static void Main(string[] args)
    {
      CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
              webBuilder.UseStartup<Startup>();
            });
  }
}

这是 Startup.cs 文件:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace TestWebApplication
{
  public class Startup
  {
    public Startup(IConfiguration configuration)
    {
      Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
      services.AddControllers();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
      if (env.IsDevelopment())
      {
        app.UseDeveloperExceptionPage();
      }

      app.UseRouting();

      app.UseAuthorization();

      app.UseEndpoints(endpoints =>
      {
        endpoints.MapControllers();
      });
    }
  }
}

When I launch this web application by using the TestWebApplication profile from Visual Studio everything works fine : kestrel is launched at http://localhost:5002 and the web browser is launched at http://localhost:5002/weatherforecast .

这正是我对提供的launchSettings.json文件的期望。

考虑对 Program.cs 进行以下更改,以自定义应用程序配置源:

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;

namespace TestWebApplication
{
  public class Program
  {
    public static void Main(string[] args)
    {
      CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration(builder =>
            {
              builder.Sources.Clear();
              builder.AddEnvironmentVariables();
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
              webBuilder.UseStartup<Startup>();
            });
  }
}

此更改破坏了与launchSettings.json文件交互方面的所有内容。 会发生以下情况:

  • kester 在http://localhost:5000https://localhost:5001上启动
  • web 浏览器http://localhost:5002/weatherforecast上启动

基本上,似乎文件launchSettings.json被忽略了,而是使用了一些默认值。

我还观察到以下情况:

  • 根本原因似乎是清除配置源的行: builder.Sources.Clear();
  • IIS express 配置文件不受此问题的影响:即使使用修改后的 Program.cs 文件,它也可以按预期工作

这是一个错误吗? 我错过了什么吗?

一些澄清

我正在清除配置源以便完全控制配置源本身。 换句话说,我想删除所有现有的配置源并从头开始。 根据这个文档,这种方法似乎是允许的。

请注意,使用WebHost class 而不是Host class 时,完全相同的代码可以正常工作。 在这种情况下,可以完全自定义配置源,并且 Kestrel 也可以读取launchSettings.json文件。 我正在尝试使用通用Host class 达到相同的效果,这是推荐的 class 用于代替 ASP.NET 核心 3.1 中的WebHost

我终于解决了这个问题。

这不是 ASP.NET 核心 3.1 错误,这是通用Host设计的工作方式。

基本上,在lanchSettings.json文件中指定的端口号配置通过一些以ASPNETCORE_为前缀的环境变量传递给 ASP.NET 核心应用程序。 这些环境变量由 Visual Studio 自动设置。 负责红隼端口绑定的称为ASPNETCORE_URLS

当做builder.Sources.Clear(); ASPNETCORE_为前缀的环境变量的配置源被清除。 所以,为了解决这个问题,有必要替换这个配置源:

.ConfigureAppConfiguration(builder =>
            {
              builder.Sources.Clear();
              builder.AddEnvironmentVariables();
              builder.AddEnvironmentVariables("ASPNETCORE_");
            })

所有详细信息都可以在这里找到

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM