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();
}
El goto retryinitialization es intencional. Garantiza que la aplicacion siga intentando arrancar indefinidamente en entornos de produccion (contenedores Docker).