HttpClient BaseAddress ist im Blazor-Projekt manchmal null
Posted: 31 Dec 2024, 16:05
Ich habe derzeit ein neues Projekt mit Blazor gestartet und verwende den automatischen Rendermodus global. Die Struktur besteht standardmäßig aus zwei Projekten: dem Server- und dem Client-Projekt. Ich habe im Client eine einfache Anmeldeseite erstellt, die mithilfe eines HttpClient eine API vom Server aufruft, um den Benutzer anzumelden. Die BaseAddress wird sowohl im Server- als auch im Client-Programm Program.cs:
Server Program.cs:
festgelegt
Client Program.cs:
Und wie die Anfrage gestellt wird:
Das Problem ist, dass HttpClient.BaseAddress manchmal null ist, manchmal ist es gefüllt. Wenn ich die App neu starte und ausführe, wird manchmal ein Fehler mit null BaseAddress ausgegeben, manchmal funktioniert es, wenn BaseAddress einen Wert hat.
Falls Ihnen das aufgefallen ist client Program.cs, ich habe ein Protokoll hinzugefügt, um die BaseAddress zu überprüfen. Wenn kein Fehler auftritt, wird das Protokoll in der Browserkonsole angezeigt. Wenn jedoch ein Fehler auftritt, ist BaseAddress nicht nur null, sondern das Protokoll wird auch nicht angezeigt. Es ist, als ob es diese Codezeile nicht durchlaufen hätte. Selbst wenn BaseAddress null ist, hätte meiner Meinung nach mindestens die Zeichenfolge „The BaseAddress is:“ protokolliert werden sollen.
Was mache ich falsch?
BEARBEITEN:
Okay, nach weiteren Tests scheint es ein Timing-Problem zu sein. Wenn ich auf die Anmeldeschaltfläche klicke, sobald sie angezeigt wird, scheint der Clientcode noch nicht ausgeführt worden zu sein (?). Aus diesem Grund wird kein Protokoll angezeigt und BaseAddress ist null. Ich vermute, das ist die vorgerenderte Serverseite (falls falsch, ich habe gerade erst mit dem Lesen begonnen)? Aber wenn ich ein paar Sekunden warte, wird das Protokoll angezeigt und BaseAddress erhält einen Wert.
Wenn dies tatsächlich der Fall ist, wie gehen wir normalerweise damit um?
EDIT 2:
Ich bin mir nicht sicher, ob es sich um ein Zeitproblem handelt, da ich auf einen Fall gestoßen bin, bei dem das Protokoll auch nach dem Warten nicht vollständig angezeigt wurde für ein paar Minuten. Aber nach dem Aktualisieren wird das Protokoll angezeigt.
Server Program.cs:
festgelegt
Code: Select all
builder.Services.AddHttpClient("ServerHttpClient", client =>
{
client.BaseAddress = new Uri(builder.Configuration["MainDomain"]!);
});
Code: Select all
var builder = WebAssemblyHostBuilder.CreateDefault(args);
Console.WriteLine($"The BaseAddress is: {builder.HostEnvironment.BaseAddress}");
builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
await builder.Build().RunAsync();
Code: Select all
public partial class Login : ComponentBase
{
[Inject]
public HttpClient HttpClient { get; set; } = default!;
async Task LogInAsync()
{
//...some code omitted for brevity
var response = await HttpClient.PostAsync("api/users/signin", content);
}
}
Falls Ihnen das aufgefallen ist client Program.cs, ich habe ein Protokoll hinzugefügt, um die BaseAddress zu überprüfen. Wenn kein Fehler auftritt, wird das Protokoll in der Browserkonsole angezeigt. Wenn jedoch ein Fehler auftritt, ist BaseAddress nicht nur null, sondern das Protokoll wird auch nicht angezeigt. Es ist, als ob es diese Codezeile nicht durchlaufen hätte. Selbst wenn BaseAddress null ist, hätte meiner Meinung nach mindestens die Zeichenfolge „The BaseAddress is:“ protokolliert werden sollen.
Was mache ich falsch?
BEARBEITEN:
Okay, nach weiteren Tests scheint es ein Timing-Problem zu sein. Wenn ich auf die Anmeldeschaltfläche klicke, sobald sie angezeigt wird, scheint der Clientcode noch nicht ausgeführt worden zu sein (?). Aus diesem Grund wird kein Protokoll angezeigt und BaseAddress ist null. Ich vermute, das ist die vorgerenderte Serverseite (falls falsch, ich habe gerade erst mit dem Lesen begonnen)? Aber wenn ich ein paar Sekunden warte, wird das Protokoll angezeigt und BaseAddress erhält einen Wert.
Wenn dies tatsächlich der Fall ist, wie gehen wir normalerweise damit um?
EDIT 2:
Ich bin mir nicht sicher, ob es sich um ein Zeitproblem handelt, da ich auf einen Fall gestoßen bin, bei dem das Protokoll auch nach dem Warten nicht vollständig angezeigt wurde für ein paar Minuten. Aber nach dem Aktualisieren wird das Protokoll angezeigt.