Comment puis-je récupérer les propriétés de HttpContext quand il retourne null?
-
22-08-2019 - |
Question
Je suis en train de faire un travail asynchrone sur un thread séparé en utilisant:
ThreadPool.QueueUserWorkItem()
et dans ce thread séparé, je dois appeler HttpContext.Current
pour que je puisse accéder à:
HttpContext.Current.Cache
HttpContext.Current.Server
HttpContext.Current.Request
Cependant, HttpContext.Current
est nulle lorsque je crée ce thread séparé.
Question
Comment puis-je créer un nouveau fil de sorte que HttpContext.Current
n'est pas nul? Ou est-il une autre façon, je peux accéder au cache, serveur et objets de demande?
La solution
Je vais essayer de ne pas tenir une référence à un objet qui dépend de la pile ASP.NET comme le HttpContext. Si vous avez besoin de faire un travail dans un autre thread, c'est parce que vous ne voulez pas attendre dans le ASP.NET un jusqu'à ce que votre tâche est terminée. Et peut-être la demande / Contexte / session est terminée alors que votre fils n'est pas.
Vous devez passer un objet avec les données nécessaires pour votre fil.
Autres conseils
Vous pouvez accéder au cache ASP.NET avec HttpRuntime.Cache même si vous ne disposez pas d'un HttpContext, mais malheureusement, vous ne pouvez pas accéder au serveur ou demande.
Si vous y pensez, ce sens de faire -. Vous ne servez pas une page afin que vous ne disposez pas d'une demande
1- Ajoutez le code en bas <system.serviceModel>
dans le fichier web.config:
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
2- Ajouter le code en bas après namespace dans le fichier de service Web:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
3- Reconstruire partie web projet. Fait!
Pour les services HttpContext.Server vous pouvez utiliser la classe HttpServerUtility. Pour le cache, vous pouvez utiliser HttpRuntime.Cache, comme il a été dit plus haut. Pour l'objet de demande, vous pouvez transmettre les données de la demande au fil lors de sa création. Des choses comme Request.QueryString ou Request.Form ... ou autre.
Si le thread séparé tente d'accéder à ces objets, alors oui, ils seront nuls. Ces objets ont une portée au niveau du fil. Si vous voulez les utiliser dans un nouveau thread vous devrez les passer dans la méthode / classe où vous avez besoin d'eux.
En général ASP.Net ne vous permet pas de faire naître de nouvelles discussions ... Voici une thread dans ASP.NET de MSDN .