Como faço para recuperar as propriedades HttpContext quando ele retorna nulo?
-
22-08-2019 - |
Pergunta
Eu estou fazendo algum trabalho assíncrono em um segmento separado usando:
ThreadPool.QueueUserWorkItem()
e neste segmento separado, eu preciso HttpContext.Current
chamada para que eu possa acessar:
HttpContext.Current.Cache
HttpContext.Current.Server
HttpContext.Current.Request
No entanto, HttpContext.Current
é nulo quando eu criar esta thread separada.
Pergunta ??h3>
Como faço para criar um novo segmento para que HttpContext.Current
não é nulo? Ou existe outra maneira que eu posso acessar o cache, Server, e solicitar objetos?
Solução
Eu tento não manter uma referência a um objeto que depende da pilha ASP.NET como o HttpContext. Se você precisa fazer algum trabalho em um segmento diferente, é porque você não quer esperar na única ASP.NET até que sua tarefa está concluída. E talvez o Pedido / Context / sessão é encerrada enquanto a sua discussão não é.
Você deve passar um objeto com os dados necessários para a sua discussão.
Outras dicas
Você pode acessar o cache ASP.NET com HttpRuntime.Cache , mesmo quando você não tem um HttpContext, mas, infelizmente, você não pode acessar Server ou solicitação.
Se você pensar bem, isso faz sentido -. Você não está servindo qualquer página que você não tem um pedido
1- Adicione código fundo em <system.serviceModel>
no arquivo Web.config:
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
2- Adicione código de fundo depois de namespace no arquivo de serviço web:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
3 reconstruir parte projeto web. Feito!
Para HttpContext.Server serviços você pode usar HttpServerUtility classe. Para o Cache você pode usar HttpRuntime.Cache, como foi dito acima. Para o objeto pedido, pode passar os dados a partir da solicitação para o segmento quando ele é criado. Coisas como Request.QueryString ou Request.Form ... ou o que quer.
Há uma implementação pool de threads aqui que fornece propagação de contexto HTTP do segmento de chamada . Eu não usei ainda, mas eu pretendo.
Se o thread separada está tentando acessar esses objetos, então sim eles vão ser nulo. Esses objetos são escopo no nível do segmento. Se você quiser usá-los em um novo segmento terá de passá-los para o método / classe onde você precisar deles.
Normalmente ASP.Net não permite que você para gerar novos tópicos ... Aqui é um post sobre o assunto.
Aqui está uma boa escrever-se na rosqueamento em ASP.NET do MSDN .