设置 Blazor Webassemble 环境的正确方法是什么?

kle*_*ium 11 c# environment asp.net-core blazor-webassembly

我的目标是能够从配置文件更改环境名称。如果服务器配置为X,那么客户端也应该使用X环境。

你知道,在 ASP.NET 中我们可以使用launchSettings.json将 IIS 服务器配置为开发,并将“真实”服务器配置为发布到生产。WASM 客户端应该看到相同的配置。我想只在这里配置一下环境,以减少发布服务器时忘记东西的后果。

有多篇文章描述了 Blazor 环境,但我对正确设置它感到困惑。

为了让客户端看到环境,我将这一行添加到 Client/Program.cs 文件中:

Console.WriteLine("Using environment " + builder.HostEnvironment.Environment);
Run Code Online (Sandbox Code Playgroud)

实验:

  • 如果我将 Server/launchSettings.json/profiles/IIS Express/environmentVariables/ASPNETCORE_ENVIRONMENT 从开发更改为生产,则该网站根本无法加载(返回 404)。

  • 在其他一些情况下,ASPNETCORE_ENVIRONMENT客户端只是忽略/无法访问。

  • 在本地运行应用程序时,环境默认为开发。发布应用程序时,环境默认为“生产”。

    对我来说有时确实如此,但并非总是如此。在某些情况下,即使我在本地运行,环境也是生产环境。

  • Blazor.start({ environment: "Staging" });本文中描述的没有效果。另外,这需要一个字符串,我如何传递服务器端配置变量的值?

  • 使用 web.config,我总是可以覆盖环境名称。有两个问题:

    1. 为什么要维护另一个配置文件?已经有 launchSettings.json,服务器将依赖于该文件。据我所知,我无法引用 web.config 文件中的其他设置。
    2. 它实际上不是blazor-environment控制环境名称的标头。为什么?
      • 删除 web.config

      • 在 Server/Startup.cs 中添加:

        app.Use(async (context, next) =>
        {
            context.Response.Headers.Add("blazor-environment", env.EnvironmentName);
            await next.Invoke();
        });
        
        Run Code Online (Sandbox Code Playgroud)
      • 在Chrome DevTools中,我可以看到标头的值确实是Development。但客户打印的是 Production。

      • 如果标头被忽略,为什么我要在 web.config 中设置它?它已设置,但 clinet WASM 项目无法读取标头,它怎么知道该名称?引用的 Blazor WASM JavaScript 文件是否已更改,环境名称是否被编译到其中?

  • 还有生成的Client/launchSettings.json,似乎完全被忽略了。

  • 至少描述了 10 种获取环境名称的方法。有些使用 appsettings.json (单独下载,或IWebAssemblyHostEnvironment,或IConfiguration,或 Razor 组件等。我想要的只是读取 C# 代码部分中的全局环境名称。

我猜这种混乱是因为 Blazor 近年来发生了变化。我有点失落。我应该使用哪一个?哪个应该始终有效?我可以摆脱更改 web.config 和 launchSettings.json 的需要吗?

Mik*_*ike 5

如果您的 wasm 由 asp.net core 应用程序托管,则调用

app.UseBlazorFrameworkFiles();
Run Code Online (Sandbox Code Playgroud)

应该自动添加所需的标题。您可以通过查看网络监视器中传回的 blazor.boot.json 文件的标头来检查这一点,该文件是 blazor 用于读取 blazor-environment 标头的请求。

请注意,在手动添加该标头的示例中,如果您没有在“AddStaticFiles”之前添加它,则该标头可能会添加到您的索引页,而不是 blazor.boot.json 文件,因此它会没有效果。

另一件需要注意的事情是对 app.UseBlazorFrameworkFiles() 的调用必须在 app.UseStaticFiles() 之前进行。这个让我绊倒了,希望这对来这里寻找答案的人有帮助:)

参考:blazor wasm读取标头的代码:https://github.com/dotnet/aspnetcore/blob/5fed81205944c528cbf7bb3a4ce369ca37bd3676/src/Components/Web.JS/src/Platform/BootConfig.ts#L29


小智 -5

我使用的是 Blazor Server,而不是 Blazor Web Assembly,但我认为您可以执行我所做的操作,只需在 ASPNETCORE_ENVIRONMENT 变量中设置环境即可。在 Visual Studio 中进行调试时,请在 launchSettings.json 文件中设置变量(请注意,如果您有多个配置文件,例如 IIS Express 和 YourProject,则每个配置文件都应存在该变量(最好保持变量值相同))。在服务器上运行应用程序时,ASPNETCORE_ENVIRONMENT 变量应作为服务器(VM 或物理本地等)上的环境变量存在,或者对于 Azure 网站(也称为 Azure 应用服务)作为“设置”->“配置”下的变量存在。请注意,对于环境变量,您通常必须注销运行时用户并重新启动服务,然后才能读取新值。

如果您有 env.IsDevelopment()、env.IsStaging() 或 env.IsProduction 等代码,则需要使用标准环境名称(Development、Staging 和 Production)。

对于 Blazor Server,在 Program.cs CreateHostBuilder 方法中调用Host.CreateDefaultBuilder(args).CongigureWebHostDefaults(webHostBuilder =>

你可以这样读取环境变量:

ConfigurationBuilder = new ConfigurationBuilder()
.AddEnvironmentVariables("ASPNETCORE_");

const string aspnetCoreEnv = "ASPNETCORE_ENVIRONMENT";
var environmentName = Environment.GetEnvironmentVariable(aspnetCoreEnv);
Run Code Online (Sandbox Code Playgroud)

现在添加包含环境名称的适当的 appsettings 文件:

ConfigurationBuilder.AddJsonFile($"appsettings.{EnvironmentName}.json", true, true);

var configuration = ConfigurationBuilder.Build();
webHostBuilder.UseConfiguration(configuration);
var hostBuilderEnvironmentSetting = webHostBuilder.GetSetting(WebHostDefaults.EnvironmentKey);
if (string.IsNullOrEmpty(hostBuilderEnvironmentSetting))
    webHostBuilder.UseSetting(WebHostDefaults.EnvironmentKey, EnvironmentName);
Run Code Online (Sandbox Code Playgroud)

如果您使用 Startup.cs,则可以使用构造函数注入,以便可以访问 Startup 中的环境:

public Startup(IConfiguration configuration, IWebHostEnvironment hostingEnvironment)
Run Code Online (Sandbox Code Playgroud)

如果 Blazor Web Assembly 配置不同,也许您仍然可以实现等效逻辑以使其加载与环境匹配的应用程序设置。

通过这种方法,我没有遇到应用程序无法正确识别环境的问题。我没有 web.config 文件,因此不需要维护其中的值。我遇到的唯一“无法加载”问题是在 Azure 中,我的发布配置指定了一个“Microsoft 身份平台”,该平台引用了 Azure 应用程序注册,而该应用程序注册在“重定向 URI”下没有一个带有我的 URI 的 Web 平台。特定于环境的应用程序服务。