c# - 为客户端 Blazor 部署环境动态配置 Http.BaseAddress

标签 c# blazor

在本例中,Hosting Blazor ,作者有一个调用 Azure Functions 的 Blazor ClientSide App。作者设置了一个Http.BaseAddress。关于在以下情况下为本地 URL 配置客户端 Blazor“Http.BaseAddress”的最佳方法的任何想法
Blazor 应用程序部署到 Azure 文件夹时的调试和 Azure Functions URL?

调试:
Http.BaseAddress = new Uri("https://localhost:12345 ");

生产:
Http.BaseAddress = new Uri("https://blazorapi.azurewebsites.net ");

@functions {
Book[] books;
string message;
  protected override async Task OnInitAsync()
  {
    message = "OnInitAsync";
    Http.BaseAddress = new Uri("https://blazorapi.azurewebsites.net");
    books = await Http.GetJsonAsync<Book[]>("/api/BooksFunction");
    message = "downloaded books";
  }
}

最佳答案

更新,因为 Blazor 变得更完整:
到目前为止,Blazor 实际上拥有我们从其他 .NET 应用程序中习惯的配置过程,只是多一点...前端-y:
您创建了一个 appsettings.json特殊配置文件,如 appsettings.Release.json .对于 Blazor,您必须将其放入 wwwroot文件夹。
该文件应如下所示:

{
  "BaseUrl": "https://localhost:12345"
}
在您的 appsettings.Release.json 中,您可以放置​​ prod url 而不是 localhost。
您现在可以进入 Program.cs 并阅读如下设置:
baseAddress = builder.Configuration.GetValue<string>("BaseUrl");
builder.Services.AddSingleton(new HttpClient 
{ 
    BaseAddress = new Uri(baseAddress) }
);
现在所有自动构造的类,如组件,都可以使用 DI 来获取配置的 HttpClient。您只需将其放在顶部:
@inject HttpClient Http
然后从那里使用它。当然,在这里使用您选择的 DI 范围( transient /范围/单例)。
或者,您知道,如果您不想使用 DI,只需将 baseAddress 保存在某处。
这是preview-5,但我们现在使用RC-1更进一步
Blazor 现已投入生产,无需再玩预览版本。

旧答案:
据我所知,目前还没有获得环境的“好”方法,但由于它仅涉及生产与开发,您可以像我一样做同样的事情,只需使用老式的编译器变量:
public class Program
{
    internal const string BaseAddress = "http://localhost:81/";
    internal const string ProdBaseAddress = "http://localhost:5001/";

    public static async Task Main(string[] args)
    {
        var builder = WebAssemblyHostBuilder.CreateDefault(args);
        builder.RootComponents.Add<App>("app");

        var host = builder.Build();
        var httpClient = host.Services.GetRequiredService<HttpClient>();
#if DEBUG
        httpClient.BaseAddress = new Uri(BaseAddress);
#else
        httpClient.BaseAddress = new Uri(ProdBaseAddress);
#endif

        Console.WriteLine($"Set BaseAddress: {BaseAddress}");
        await host.RunAsync();
    }
}
只要确保 DEBUG 变量实际上是在你的 Debug 版本中设置的——我的没有。
编辑:忘记了这一点:在本地您可能使用“调试”配置,而在部署时您可能使用不同的配置,例如“发布”。

关于c# - 为客户端 Blazor 部署环境动态配置 Http.BaseAddress,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54378938/

相关文章:

c# - 是否有任何静态代码分析工具可以查看可能导致死锁的潜在执行路径(C#)

c# - 由于一个或多个外键属性不可为空,因此无法更改关系。 (2)

asp.net-core - 将范围服务注入(inject) DelegatingHandler 抛出 InvalidOperationException

c# - 如何从 blazor 中的子项调用父 razor 组件中的函数?

c# - 方法链接等效?

c# - WPF NotifyIcon - 隐藏托盘弹出窗口

c# - DDD - 实体状态转换

azure - 如何解决 azure 发布的 Blazor 应用程序上的 XMLHttpRequest 错误

c# - Blazor/Entity Framework - 将子集合添加到时更新父级

c# - 在 blazor 中单击按钮时执行异步方法