Saltar al contenido principal

Blazor Server Guidelines

Convenciones obligatorias para el arranque de aplicaciones Blazor Server en el ecosistema Dinaup.

Requisitos

<PackageReference Include="Dinaup" Version="*" />

1. Banner de arranque

Identifica si un fallo al iniciar es causado por Docker o por la propia aplicacion.

Console.WriteLine("══════════════════════════════════════════════════════════════");
Console.WriteLine(" [APP_NAME] - Starting application");
Console.WriteLine($" Date/Time: {DateTime.Now:yyyy-MM-dd HH:mm:ss}");
Console.WriteLine("══════════════════════════════════════════════════════════════");

2. Verificacion de conectividad

Evita que problemas de red o firewall provoquen errores dificiles de diagnosticar en otros servicios.

while (await Dinaup.Extensions.CheckNetworkConnectivityAsync() == false)
{
Console.WriteLine("[ERROR] No internet connection. Retrying in 1 second...");
await Task.Delay(1000);
}

3. Puerto de depuracion

Previene conflictos de puertos con otras aplicaciones durante el desarrollo. En produccion, los puertos se configuran mediante variables de entorno.

const int DEBUG_PORT = 6114;

if (Debugger.IsAttached)
builder.WebHost.UseUrls("http://*:" + DEBUG_PORT.ToString());

4. Endpoint de version

Todas las aplicaciones deben exponer un endpoint /Version para monitoreo.

app.MapGet("/Version", () => Results.Ok(new
{
version = Assembly.GetExecutingAssembly().GetName().Version.ToString()
}));

5. Manejo de errores fatales

Si la inicializacion falla, la aplicacion entra en modo de recuperacion: levanta un servidor minimo con un middleware de error, espera 10 segundos y reintenta.

retryinitialization:
try
{
var builder = WebApplication.CreateBuilder(args);

if (Debugger.IsAttached)
builder.WebHost.UseUrls("http://*:" + DEBUG_PORT.ToString());

// ... inicializacion normal ...
app.Run();
}
catch (Exception ex)
{
Console.WriteLine("══════════════════════════════════════════════════════════════");
Console.WriteLine(" [ERROR] Fatal error during initialization");
Console.WriteLine($" Message: {ex.Message}");
Console.WriteLine($" Type: {ex.GetType().Name}");
Console.WriteLine("══════════════════════════════════════════════════════════════");

try { Dinaup.Logs.Write_Flag("INI", ex); } catch { }

var builderRecovery = WebApplication.CreateBuilder(args);
if (Debugger.IsAttached)
builderRecovery.WebHost.UseUrls("http://*:" + DEBUG_PORT.ToString());

var appRecovery = builderRecovery.Build();
appRecovery.UseMiddleware<ErrorFatalMiddleware>();

Console.WriteLine("[LOG] Recovery mode. Retrying in 10 seconds...");
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10));
await appRecovery.RunAsync(cts.Token);

goto retryinitialization;
}
finally
{
Dinaup.Logs.CloseAndFlush();
}
aviso

El goto retryinitialization es intencional. Garantiza que la aplicacion siga intentando arrancar indefinidamente en entornos de produccion (contenedores Docker).