ASP.NET Core
Middleware de correlación y de mantenimiento, endpoints de versión y entorno, comprobación de estado, sesión web, cookies, Turnstile y extensiones de petición.
El módulo dinaup.aspnet del paquete Dinaup integra la plataforma en una aplicación ASP.NET Core: correlación de logs entre servicios, endpoints de estado, una página de mantenimiento cuando cae la conexión con Dinaup, sesión web del usuario y extensiones de petición. Todo está en el namespace Dinaup.
Antes de empezar
- Paquete
Dinaupinstalado. Ver SDK .NET. - Para la página de mantenimiento y la sesión web, un
DinaupClientCconectado y registrado en el contenedor. Ver Cliente Dinaup.
using Dinaup;Correlación de logs entre servicios
CorrelationIdMiddleware propaga un identificador de correlación por petición. Lee la cabecera X-Correlation-Id; si no viene, genera uno de 16 caracteres hexadecimales. Lo añade al LogContext de Serilog como propiedad correlation_id y lo devuelve en la cabecera de respuesta para que el cliente o el siguiente servicio lo reutilicen.
app.UseCorrelationId();Constantes públicas: CorrelationIdMiddleware.HeaderName (X-Correlation-Id) y CorrelationIdMiddleware.PropertyName (correlation_id). Fuera de un middleware, Logs.Correlation(correlationId) añade el mismo valor a mano. Ver Dinaup.Logs.
Endpoints de versión y entorno
MapDinaupEnv registra dos endpoints GET de solo lectura para monitorización y despliegue:
app.MapDinaupEnv();| Ruta | Respuesta |
|---|---|
GET /Version | { "version" } |
GET /Env | { "app", "version", "env", "host", "loglvl" } |
version es la versión de tu app (la del ensamblado de entrada), no la del SDK. /Env devuelve además el nombre de la app, el entorno de ejecución, el hostname y el nivel de log activo. Nombre y versión salen del ensamblado de entrada (GetAppName, GetAppVersion); si la detección automática falla (tests, IIS), fija el ensamblado al arrancar con SetEntryAssembly(assembly).
Comprobación de estado
El SDK no registra la ruta de salud. Expón /HealthCheck con las comprobaciones de estado estándar de ASP.NET Core y registra como comprobaciones los clientes del SDK que implementan IHealthCheck (DinaupClientC, MyAppKVClient, DinaS3ClientC, DinaS3MultiClientC).
builder.Services.AddHealthChecks()
.AddCheck("Dinaup", dinaupClient); // DinaupClientC implementa IHealthCheck
var app = builder.Build();
app.MapHealthChecks("/HealthCheck");
app.MapDinaupEnv(); // /Version y /EnvDinaupClientC.CheckHealthAsync(context, cancellationToken) es la implementación de IHealthCheck; HealthCheckAsync() devuelve el mismo veredicto como bool. Para leer el estado de cualquier IHealthCheck fuera del endpoint: await check.StatusAsyn() devuelve el HealthStatus, y IsHealthy(), IsDegraded() e IsUnhealthy() lo comparan.
Página de mantenimiento
DinaupWebMiddleware corta el tráfico cuando el cliente Dinaup no está conectado. Si IsConnected es false o no hay DefaultSession, responde 503 Service Unavailable con una página de mantenimiento que se recarga sola a los 30 segundos. Si hay conexión, refresca la sesión web (UpdateSessionAsync) y continúa la canalización.
app.UseMiddleware<DinaupWebMiddleware>();Regístralo después de tener DinaupClientC y DinaupUserWebSession en el contenedor: InvokeAsync(httpContext, session, conector) los recibe por inyección en cada petición.
Sesión web del usuario
DinaupUserWebSession mantiene la sesión de un usuario de Dinaup en una app web con cookies. Se construye con new DinaupUserWebSession(dinaupClient, cookie, httpContextAccessor), donde cookie es un ICookie (la clase Cookie del módulo lo implementa sobre IJSRuntime e IHttpContextAccessor).
| Miembro | Qué hace |
|---|---|
SignInAsync(SignInModel) | Inicia sesión con correo y contraseña y guarda la cookie de sesión. |
SetSession(SessionSignInResponse) | Fija la sesión a partir de una respuesta de Session_SignInAsync. |
UpdateSessionAsync(useCache = true) | Refresca los datos de la sesión desde el servidor o desde la caché. |
CloseSession() | Cierra la sesión y borra la cookie. |
IsLogged, TwoFactorPending, NeedsPasswordChange | Estado de la sesión. |
UserId, UserIdSTR, UserName, Email, Nombre, LicenseId | Datos del usuario. Session es el DinaupUserSessionDTO entero; nunca es nulo. |
Request_UserIP, Request_UserAgent, Request_Referer | Datos de la petición en curso. |
Cookie(key), CookiesAccepted, ActualizarCookiesNavegador() | Lectura y escritura de cookies pendientes de volcar al navegador. |
SessionChanged | Evento que se dispara al cambiar la sesión; TriggerSessionChanged() lo dispara a mano. |
Avisos_Ok, Avisos_Errores | Listas de avisos para mostrar en la interfaz. |
ICookie define SetValue(key, value, days) y GetValue(key, def), ambos asíncronos. DinaupUserWebSession implementa IUserSession, así que sirve como DefaultSession del cliente.
Otras piezas
SingleExecutionControllerAttribute: atributo de acción de controlador que impide su ejecución concurrente por ruta. Devuelve429 Too Many Requestssi la acción ya está en curso o si no ha pasado el intervalo mínimo:[SingleExecutionController(minIntervalSeconds: 60)].TurnstileValidator: valida el token de Cloudflare Turnstile de un formulario público. Fija las propiedades estáticaspublickeyysecretKeyal arrancar y llama aawait TurnstileValidator.ValidateToken(token, remoteIp); devuelvefalseante cualquier error y lo registra en el log.ThrowIf_InvalidDataAnnotations(obj, argName)yThrowIf_IsTooOld(fecha, argName): guardas de argumentos para modelos con anotaciones de datos y para fechas.
Extensiones de petición
Extensiones sobre HttpContext y HttpRequest para leer la petición detrás de proxies y Cloudflare.
| Extensión | Qué devuelve |
|---|---|
context.GetUserIP() | La IP real del usuario, leyendo las cabeceras del proxy. |
context.GetUserAgent(), context.GetBrowser() | User agent entero y nombre del navegador. |
context.GetHost() | El host de la petición. |
context.GetUserCountry() | El país que informa Cloudflare. |
request.ReadGet(clave), request.ReadPost(clave), request.ReadGetOrPost(clave) | Un parámetro de la cadena de consulta, del cuerpo o de cualquiera de los dos. |
request.ReadGetDic(), request.ReadGetOrPostDic(), request.ReadHeadersDic() | Todos los parámetros o cabeceras como Dictionary<string, string>. |
navigationManager.ReadGET(clave) | El mismo parámetro de la cadena de consulta desde Blazor. |
El montaje completo de una app con inicio de sesión de empleados y datos por empresa está en Apps multi-tenant.