c# - setobjectasjson - session mvc.net core




Como obter o HttpContext.Current no ASP.NET Core? (2)

Como regra geral, a conversão de um aplicativo Web Forms ou MVC5 para o ASP.NET Core exigirá uma quantidade significativa de refatoração.

HttpContext.Current foi removido no ASP.NET Core. Acessar o contexto HTTP atual de uma biblioteca de classes separada é o tipo de arquitetura confusa que o ASP.NET Core tenta evitar. Existem algumas maneiras de reformular isso no ASP.NET Core.

Propriedade HttpContext

Você pode acessar o contexto HTTP atual por meio da propriedade HttpContext em qualquer controlador. A coisa mais próxima do seu exemplo de código original seria passar o HttpContext para o método que você está chamando:

public class HomeController : Controller
{
    public IActionResult Index()
    {
        MyMethod(HttpContext);

        // Other code
    }
}

public void MyMethod(Microsoft.AspNetCore.Http.HttpContext context)
{
    var host = $"{context.Request.Scheme}://{context.Request.Host}";

    // Other code
}

Parâmetro HttpContext no middleware

Se você estiver criando um middleware personalizado para o pipeline do ASP.NET Core, o HttpContext da solicitação atual será passado automaticamente para o método Invoke :

public Task Invoke(HttpContext context)
{
    // Do something with the current HTTP context...
}

Acessador de contexto HTTP

Finalmente, você pode usar o serviço auxiliar IHttpContextAccessor para obter o contexto HTTP em qualquer classe que seja gerenciada pelo sistema de injeção de dependência do ASP.NET Core. Isso é útil quando você tem um serviço comum usado por seus controladores.

Solicite essa interface em seu construtor:

public MyMiddleware(IHttpContextAccessor httpContextAccessor)
{
    _httpContextAccessor = httpContextAccessor;
}

Você pode acessar o contexto HTTP atual de maneira segura:

var context = _httpContextAccessor.HttpContext;
// Do something with the current HTTP context...

IHttpContextAccessor nem sempre é adicionado ao contêiner de serviço por padrão, portanto, registre-o no ConfigureServices apenas para estar seguro:

public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpContextAccessor();
    // if < .NET Core 2.2 use this
    //services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();

    // Other code...
}

Esta questão já tem uma resposta aqui:

No momento, estamos reescrevendo / convertendo nosso aplicativo ASP.NET WebForms usando o ASP.NET Core. Tentando evitar a reengenharia o máximo possível.

Há uma seção em que usamos o HttpContext em uma biblioteca de classes para verificar o estado atual. Como posso acessar o HttpContext.Current no .NET Core 1.0?

 var current = HttpContext.Current;
     if (current == null)
      {
       // do something here
       // string connection = Configuration.GetConnectionString("MyDb");
      }

Eu preciso acessar isso para construir o host do aplicativo atual.

$"{current.Request.Url.Scheme}://{current.Request.Url.Host}{(current.Request.Url.Port == 80 ? "" : ":" + current.Request.Url.Port)}";

Existe uma solução para isso se você realmente precisar de um acesso estático ao contexto atual. Em Startup.Configure (…)

app.Use(async (httpContext, next) =>
{
    CallContext.LogicalSetData("CurrentContextKey", httpContext);
    try
    {
        await next();
    }
    finally
    {
        CallContext.FreeNamedDataSlot("CurrentContextKey");
    }
});

E quando você precisar, você pode obtê-lo com:

HttpContext context = CallContext.LogicalGetData("CurrentContextKey") as HttpContext;

Espero que isso ajude. Tenha em mente que essa solução alternativa é quando você não tem escolha. A melhor prática é usar a injeção de dependência.





.net-core