C# 如何使用环境变量覆盖blazor客户端配置?

C# 如何使用环境变量覆盖blazor客户端配置?,c#,environment-variables,blazor,blazor-webassembly,C#,Environment Variables,Blazor,Blazor Webassembly,我有一个工作的web客户端,它使用“wwwroot/appsettings.json”文件进行配置 现在,我只想使用环境变量覆盖单个设置(例如,实际上会有许多任意的覆盖)。是否有类似于ASP.NET核心服务器的即用机制(只需调用扩展方法并结合json、env.variables) 我不是询问多个.json文件并根据环境变量在它们之间切换,这是完全不同的情况 到目前为止,我还没有找到任何接近的方法,所以考虑到DIY方法,我看到了一条丑陋的路径——将客户端配置文件移动到托管服务器,在client.j

我有一个工作的web客户端,它使用“wwwroot/appsettings.json”文件进行配置

现在,我只想使用环境变量覆盖单个设置(例如,实际上会有许多任意的覆盖)。是否有类似于ASP.NET核心服务器的即用机制(只需调用扩展方法并结合json、env.variables)

我不是询问多个.json文件并根据环境变量在它们之间切换,这是完全不同的情况

到目前为止,我还没有找到任何接近的方法,所以考虑到DIY方法,我看到了一条丑陋的路径——将客户端配置文件移动到托管服务器,在client.json文件中添加主节点,如“client”,使用前缀为“client”的环境变量,使用ASP.NET服务器机制合并这些数据,将其转储回文件以供客户端使用。希望它能起作用:-)。

所以我选择了DIY路径:-)如果有人喜欢,下面是步骤:

  • 在web客户端wwwroot创建3个带有空JSON的文件——appsettings.JSON、appsettings.Development.JSON和生产版本

  • 例如,将整个web客户端配置放在“客户端”节点的宿主服务器的appsettings.json中

  • 在您的服务器启动构造函数中,像往常一样创建配置,但随后获取整个“客户机”部分并将其“jsonize”返回(请参阅:)--将其转换为字符串并写入$“wwwroot/appsettings.{env.env.EnvironmentName}.json”(其中
    env
    IWebHostEnvironment

就这样,我在开发模式和生产环境中进行了测试。我看到的唯一缺点是:

  • 看起来很奇怪:-)
  • 当使用VS执行时,写入的文件不是相对于二进制文件,而是相对于项目——因此,当您完成时,您必须删除新创建的文件(否则在下一次运行时,VS会抱怨两个静态文件之间存在冲突)
可以使用env替代设置。服务器端的变量使用“CLIENT”前缀,其余的和往常一样

为了记录在案,我并不是说这是完美的,但除了我在问题中提出的问题之外,我没有寻找更多的东西。然而,我想做的是减少步骤的数量,或者更好地使用一些已经存在的机制。我将非常感谢这些领域的改进/提示。

因此我选择了DIY路径:-)如果有人喜欢,这里有以下步骤:

  • 在web客户端wwwroot创建3个带有空JSON的文件——appsettings.JSON、appsettings.Development.JSON和生产版本

  • 例如,将整个web客户端配置放在“客户端”节点的宿主服务器的appsettings.json中

  • 在您的服务器启动构造函数中,像往常一样创建配置,但随后获取整个“客户机”部分并将其“jsonize”返回(请参阅:)--将其转换为字符串并写入$“wwwroot/appsettings.{env.env.EnvironmentName}.json”(其中
    env
    IWebHostEnvironment

就这样,我在开发模式和生产环境中进行了测试。我看到的唯一缺点是:

  • 看起来很奇怪:-)
  • 当使用VS执行时,写入的文件不是相对于二进制文件,而是相对于项目——因此,当您完成时,您必须删除新创建的文件(否则在下一次运行时,VS会抱怨两个静态文件之间存在冲突)
可以使用env替代设置。服务器端的变量使用“CLIENT”前缀,其余的和往常一样


为了记录在案,我并不是说这是完美的,但除了我在问题中提出的问题之外,我没有寻找更多的东西。然而,我想做的是减少步骤的数量,或者更好地使用一些已经存在的机制。我将非常感谢这些方面的改进/提示。

Blazor使用了与.NET Core相同的框架,或者现在我猜也是.NET 5.0。默认情况下,它会自动拉入环境变量。若你们还并没有创建自己的主机生成器,它已经在做你们想要的事情了。@Crowcoder,谢谢你们,但即使在服务器上,我也并没有看到任何自动的东西——我调用
AddEnvironmentVariables
扩展方法来获取env。将变量考虑在内。我在“Program.cs”中为web客户端尝试了这个方法,但原始的“builder.Configuration”和使用上述方法手动构建的配置都给出了相同的结果,我没有看到env。这些配置中的变量。对于我转储的记录,在“Index.razor”页面中使用
Console.WriteLine
进行配置,并在浏览器控制台中检查输出。您不需要调用AddEnvirementVariables,它已在默认主机生成器中完成。一定是出了什么事。我一直使用环境变量来覆盖appsettings。@Crowcoder,我不知道怎么了,我只知道我看到了什么——在客户端没有100%等效的流,就像在服务器上一样。例如,我试图阅读env。手动设置变量--未设置。WebAssembly不支持环境变量,是吗?如果真是这样,那就太奇怪了。Blazor使用与.NETCore相同的框架,或者现在我猜也是.NET5.0。默认情况下,它会自动拉入环境变量。若你们还并没有创建自己的主机生成器,它已经在做你们想要的事情了。@Crowcoder,谢谢你们,但即使在服务器上,我也并没有看到任何自动的东西——我调用
AddEnvironmentVariables
扩展方法来获取env。将变量考虑在内。我在“Program.cs”中为web客户端尝试了这个方法,但原始的“builder.Configuration”和使用上述方法手动构建的配置都给出了相同的结果,我没有看到env。这些配置中的变量。对于我转储的记录,在“Index.razor”页面中使用
Console.WriteLine
进行配置,并在浏览器控制台中检查输出。您不需要调用AddEnvirementVariables,它已在默认主机生成器中完成。一定有