Comment puis-je récupérer les propriétés de HttpContext quand il retourne null?

StackOverflow https://stackoverflow.com/questions/529286

  •  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?

Était-ce utile?

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!

référence

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.

Il y a un pool de threads mise en œuvre qui fournit la propagation du contexte HTTP du thread appelant . Je ne l'ai pas encore utilisé, mais je prévois.

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 .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top