Serviço de API da Web - Como usar "HttpContext.Current" na tarefa assíncrona

Estou usando um método assíncrono "Post" do serviço de descanso webApi:

public async Task<object> Post([FromBody]string data)
{
      object response = ExecuteServerLogics(data);

      return response;
}

Esse código acima funcionou bem, mas em algumas chamadas do cliente, tivemos problemas de desempenho.

Depois de ler alguns artigos aqui, notei que nosso serviço de descanso webApi não está realmente trabalhando de forma assíncrona com as solicitações de entrada da Web, porque esquecemos de usarpadrão assíncrono / aguardado :

public async Task<object> Post([FromBody]string data)
{
      object response = await Task<object>.Run( () =>
      {
           return ExecuteServerLogics(data);
      });

      return response;
}

Após essa correção, notamos que o desempenho melhorou, mas encontramos outro problema crítico: ao acessarHttpContext.Current - retorna referência nula:

public async Task<object> Post([FromBody]string data)
{
      object response = await Task<object>.Run( () =>
      {
           var currentContext = HttpContext.Current; // Returns Null!
           return ExecuteServerLogics(data);
      });

      return response;
}

Tentamos encontrar uma solução para isso e, na maioria das postagens, descobrimos que deveríamos passar osHttpContext referência na tarefa interna que executa as lógicas do servidor. O problema com esta solução é que os métodos lógicos do servidor usam muitas classes estáticas que usam"HttpContext.Current" tal como -

Registradores de chamadas.classes de segurança estática que recuperam o user.identityclasses de segurança estática que recuperam os dados da sessão da solicitação recebida etc.

Portanto, passando o"HttpContext.Current" a referência do segmento de trabalho não o resolverá.

Quando tentamos a próxima solução:

public async Task<object> Post([FromBody]string data)
    {
          // Save worker context:
          var currentContext = HttpContext.Current; 

          object response = await Task<object>.Run( () =>
          {
               // Set the context of the current task :
               HttpContext.Current = currentContext ; // Causes the calls not to work asynchronously for some reason!

               // Executes logics for current request:
               return ExecuteServerLogics(data);
          });

          return response;
    }

por alguma razão, percebemos que o desempenho piorou novamente, como se tivesse voltado a funcionar de forma síncrona novamente.

Nossos problemas são:

1 Por que no último exemplo, definindo o"HttpContext.Current" dentro da tarefa de espera, faz com que as solicitações retornem os mesmos resultados de desempenho ruins, semelhantes aossíncrono resultados?

2) Existe outra maneira de usarmos"HttpContext.Current" dentro da tarefa interna que chama - "ExecuteServerLogics" e em todas as classes estáticas que também chamam"HttpContext.Current"? Estou fazendo o projeto inteiro errado de alguma forma?

Obrigado!

questionAnswers(3)

yourAnswerToTheQuestion