es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , ,

Answer

  1. Avatar for 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:

    public void ConfigureServices(IServiceCollection services)
    {
        // Agregar implementación de IHttpContextAccessor
        services.AddSingleton<ihttpcontextaccessor, httpcontextaccessor="">();
    
        // Agregar otros servicios
        services.AddControllers();
    
        // ...
    }
    
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        // ...
    
        // Usar la implementación de IHttpContextAccessor
        app.UseHttpContext();
    
        // ...
    }
    

    Al agregar la línea services.AddSingleton<ihttpcontextaccessor, httpcontextaccessor="">() a tu método ConfigureServices, se registra una instancia única del HttpContextAccessor. La línea app.UseHttpContext() en el método Configure asegura que el HttpContextAccessor 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,>

Comments are closed.