Blazor:管理环境特定的变量

Gre*_*egH 8 c# .net-core asp.net-core blazor

如何管理客户端blazor中不同环境之间不同的访问变量?通常,由于我使用Azure来发布应用程序,因此我会将appsettings.json文件用于本地应用程序设置,然后在我的App Service的“ Azure应用程序设置”部分中为本地环境和其他环境之间的条目设置条目。

我要完成的示例:

客户端Blazor:

@functions {
    //...more code here
    await Http.PostJsonAsync<object>("http://localhost:50466/api/auth/register", vm);
}
Run Code Online (Sandbox Code Playgroud)

在已部署的Web服务器上,应将其转换为:

@functions {
    //...more code here
    await Http.PostJsonAsync<object>("http://wwww.mywebsite.com/api/auth/register", vm);
}
Run Code Online (Sandbox Code Playgroud)

因此,我正在寻找一种方法来将站点根URL存储在环境变量中,并在发布时对其进行转换。有没有Blazor-ey的方法可以做到这一点?

Kli*_* Ru 5

您可以使用配置接口创建单例并将其注入到您的组件中。

.csproj

<ItemGroup>
   <EmbeddedResource Include="appsettings.Development.json" Condition="'$(Configuration)' == 'Debug'">
     <LogicalName>appsettings.json</LogicalName>
   </EmbeddedResource>
   <EmbeddedResource Include="appsettings.json" Condition="'$(Configuration)' == 'Release'">
      <LogicalName>appsettings.json</LogicalName>
   </EmbeddedResource>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

启动.cs

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton(GetConfiguration());
    }

    private IConfiguration GetConfiguration()
    {
        // Get the configuration from embedded dll.
        using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("appsettings.json"))
        using (var reader = new StreamReader(stream))
        {
            return JsonConvert.DeserializeObject<IConfiguration>(reader.ReadToEnd());
        }
    }
Run Code Online (Sandbox Code Playgroud)

我的组件.razor

@inject Configuration.IConfiguration Configuration;
Run Code Online (Sandbox Code Playgroud)

或者看看这个问题

  • 我正在尝试使用此代码,但收到错误:Newtonsoft.Json.JsonSerializationException:'无法创建 Microsoft.Extensions.Configuration.IConfiguration 类型的实例。类型是接口或抽象类,无法实例化。我缺少什么? (3认同)

Vib*_*nRC 3

use 有多种方法可以做到这一点,

相信还没有任何官方方法记录!

我的建议是使用好的旧方法,针对不同的环境使用多个配置文件,并仅复制要在预期环境中使用的配置文件。

在解决方案文件夹中创建一个名为env的文件夹。并创建名为devprod 的子文件夹。像下面这样。

|- env
   |- dev
   |- prod
   |
Run Code Online (Sandbox Code Playgroud)

将不同的配置文件(具有相同名称和不同配置的文件)放入devprod文件夹中。

创建批处理文件以将适当的环境复制到wwwroot文件夹。(我更喜欢这个而不是下一步,因为这对 CI 非常友好,不需要在构建服务器中安装 Visual Studio)

或者

将以下代码添加到Blazor项目post-build event

if $(ConfigurationName) == Debug (
  copy /Y "$(ProjectDir)env\dev\*" "$(TargetDir)\wwwroot"
) ELSE (
  copy /Y "$(ProjectDir)env\prod\*" "$(TargetDir)\wwwroot"
)
Run Code Online (Sandbox Code Playgroud)

由于您的配置文件位于 www 文件夹中,您可以通过打开该文件并阅读其中的内容,轻松地从 blazor 应用程序引用该文件。