HttpContext de ASP.NET es nulo en Azure.
Tengo una aplicación web ASP.NET Blazor, la cual está alojada en Azure. Todo funciona, excepto una cosa menor. Utilizo IHttpContextAccessor.HttpContext
como se describe en la Documentación.
public class SessionService : ISessionService
{
private readonly IHttpContextAccessor httpContextAccessor;
private readonly IUserService userService;
<pre><code> public SessionService(
IUserService userService,
IHttpContextAccessor httpContextAccessor)
{
this.userService = userService;
this.httpContextAccessor = httpContextAccessor;
}
public async Task<User> GetUser()
{
var userId = this.httpContextAccessor.HttpContext?.Items["userId"]?.ToString();
if (userId == null)
{
return null;
}
if (!int.TryParse(userId, out var parsedUserId))
{
return null;
}
return await this.userService.Get(parsedUserId);
}
/// <inheritdoc />
public async Task AuthenticateUser()
{
if (this.httpContextAccessor.HttpContext == null)
{
return;
}
// Lógica de autenticación
// ...
this.httpContextAccessor.HttpContext.Items["userId"] = authenticatedUser.id;
}
}
</code></pre>
Más tarde llamo a este código de manera similar a esto:
var user = await sessionService.GetUser();
if (user == null)
{
await sessionService.AuthenticateUser();
user = await sessionService.GetUser();
}
Esto funciona en todas las máquinas locales en las que lo he probado hasta ahora. No importa si lo construyo en Release o en Debug. Todos los datos se cargan correctamente y puedo obtener el ID del usuario actualmente conectado.
De todas formas, si publico la aplicación en Azure, el HttpContext siempre es nulo. He revisado la documentación varias veces y no encuentro nada que me oriente en la dirección correcta. ¿Necesito configurar algo específicamente para usar el HttpContext?
davy.ai
Sí, necesitas configurar tu aplicación web de Azure para usar el IHttpContextAccessor. Por defecto, HttpContext no está disponible para una aplicación web de Azure. Para habilitarlo, debes agregar el siguiente código a tu archivo Startup.cs:
Al agregar la línea
services.AddSingleton<ihttpcontextaccessor, httpcontextaccessor="">()
a tu método ConfigureServices, se registra una instancia única delHttpContextAccessor
. La líneaapp.UseHttpContext()
en el método Configure asegura que elHttpContextAccessor
esté disponible en toda la aplicación.Una vez que hayas agregado este código, HttpContext debería estar disponible en tu aplicación web de Azure y tu código debería funcionar como se esperaba.</ihttpcontextaccessor,></ihttpcontextaccessor,>