fix(worker): Base-URL ohne Schema laesst die Ticket-Anbindung scheitern

Ein blanker Hostname ist eine relative URI; HttpClient lehnt sie mit
InvalidOperationException ab. Die lief an dem zu engen catch-Filter
vorbei, flog roh aus dem Hub und wurde von TryInvokeAsync zu null
verschluckt - die UI meldete "Worker not reachable", obwohl der Worker
lief und die Ursache eine Eingabe war.

- TicketSystemConfig ergaenzt fehlendes http://
- BandelTicketClient uebersetzt jede Transport-Exception in eine
  lesbare TicketApiException
- TestTicketConnection faengt alles und antwortet mit dem Grund
- GetTicketSettings liefert die effektive URL, damit die Ergaenzung
  sichtbar ist
This commit is contained in:
mika kuns
2026-08-27 14:03:52 +02:00
parent 2fe2ac83b1
commit 3322152b9c
6 changed files with 95 additions and 8 deletions
+16 -4
View File
@@ -1274,8 +1274,10 @@ public sealed class WorkerHub : Microsoft.AspNetCore.SignalR.Hub
.ToList();
}
// Liefert die EFFEKTIVE Base-URL (inkl. ergänztem Schema), nicht den rohen Feldwert: sonst
// sieht der Nutzer im Tab weiter "host.local", während der Client "http://host.local" ruft.
public TicketSettingsDto GetTicketSettings()
=> new(_cfg.TicketApiBaseUrl, _ticketConfig.Token is not null);
=> new(_ticketConfig.BaseUrl, _ticketConfig.Token is not null);
public void SetTicketApiBaseUrl(string? baseUrl)
{
@@ -1301,7 +1303,10 @@ public sealed class WorkerHub : Microsoft.AspNetCore.SignalR.Hub
var identity = await client.GetIdentityAsync(Context.ConnectionAborted);
return new TicketConnectionDto(true, identity.UserName, identity.Scopes, null);
}
catch (TicketApiException ex)
// "Verbindung testen" ist die eine Stelle, an der ein Fehler eine ANTWORT ist und keine
// Ausnahme: wirft der Hub, schluckt WorkerClient.TryInvokeAsync das Ergebnis zu null und
// die UI zeigt "Worker not reachable" statt des Grundes. Deshalb hier alles einfangen.
catch (Exception ex)
{
return new TicketConnectionDto(false, null, Array.Empty<string>(), ex.Message);
}
@@ -1311,8 +1316,15 @@ public sealed class WorkerHub : Microsoft.AspNetCore.SignalR.Hub
{
var client = _ticketClients.Create();
if (client is null) return new List<TicketProjectDto>();
var projects = await client.GetProjectsAsync(Context.ConnectionAborted);
return projects.Select(p => new TicketProjectDto(p.Id, p.Title, p.DepartmentName)).ToList();
try
{
var projects = await client.GetProjectsAsync(Context.ConnectionAborted);
return projects.Select(p => new TicketProjectDto(p.Id, p.Title, p.DepartmentName)).ToList();
}
catch (TicketApiException ex)
{
throw new HubException(ex.Message);
}
}
public async Task<TicketImportResultDto> ImportTickets(string listId)