HttpContext.Le courant est nul dans un Rappel asynchrone
Tente d'accéder à la HttpContext.Current
dans un appel de méthode en arrière, je peux donc modifier un Session
variable, cependant je reçois l'exception que HttpContext.Current
est null
. La méthode de rappel est déclenché de manière asynchrone, lorsque le _anAgent
objet qui la déclenche.
Je suis toujours pas sûr de la solution après le visionnement de similaire questions sur DONC.
Une version simplifiée de mon code ressemble à ceci:
public partial class Index : System.Web.UI.Page
protected void Page_Load()
{
//aCallback is an Action<string>, triggered when a callback is received
_anAgent = new WorkAgent(...,
aCallback: Callback);
...
HttpContext.Current.Session["str_var"] = _someStrVariable;
}
protected void SendData() //Called on button click
{
...
var some_str_variable = HttpContext.Current.Session["str_var"];
//The agent sends a message to another server and waits for a call back
//which triggers a method, asynchronously.
_anAgent.DispatchMessage(some_str_variable, some_string_event)
}
//This method is triggered by the _webAgent
protected void Callback(string aStr)
{
//** This culprit throws the null exception **
HttpContext.Current.Session["str_var"] = aStr;
}
[WebMethod(EnableSession = true)]
public static string GetSessionVar()
{
return HttpContext.Current.Session["str_var"]
}
}
Pas sûr si c'est nécessaire mais mon WorkAgent
classe ressemble à ceci:
public class WorkAgent
{
public Action<string> OnCallbackReceived { get; private set; }
public WorkAgent(...,
Action<string> aCallback = null)
{
...
OnCallbackReceived = aCallback;
}
...
//This method is triggered when a response is received from another server
public BackendReceived(...)
{
...
OnCallbackReceived(some_string);
}
}
Ce qui se passe dans le code:
En cliquant sur un bouton appelle la SendData()
méthode, à l'intérieur de ce la _webAgent
envoie un message à un autre serveur et attend la réponse (dans le temps, l'utilisateur peut interagir avec cette page et vous référer à la même SessionID
). Une fois reçu, il appelle la BackendReceived()
méthode qui, de retour dans le .aspx.cs page appelle la Callback()
méthode.
Question:
Lorsque le WorkAgent
déclenche la Callback()
méthode qu'il tente d'accéder à HttpContext.Current
qui est null
. Pourquoi est-ce le cas quand, si je continue sur, en ignorant l'exception, je peux encore obtenir le même SessionID
et la Session
variable à l'aide de l'ajax retourné GetSessionVar()
méthode.
Dois-je activer les aspNetCompatibilityEnabled la mise en?
Je devrais être en train de créer une sorte de asynchrone module gestionnaire d'?
Est-ce lié à Intégrée/mode Classique?
- Pourquoi compliquer ce en utilisant les rappels, une meilleure solution pourrait être d'utiliser ajax côté client, de cette façon, l'utilisateur peut interagir avec le site. Et l'appel à l'autre système peut être simplement un appel de la méthode normale
- Ajax est utilisé par le client pour la plupart partie, n'a tout simplement pas l'inclure dans le code ci-dessus (il se met à jour
HttpContext Session
variables et base de données SQL). La seule méthode qui n'est pas un appel ajax estSendData()
. Cela envoie des données à un autre serveur. Je suis juste confus pourquoi leHttpContect.Current
devient null sur le rappel. - Veuillez voir ma réponse pour une explication sur le pourquoi de ce qui se passe
Vous devez vous connecter pour publier un commentaire.
Voici une classe de solution de travail pour les cas les plus simples jusqu'à présent dans MVC5 (MVC6 prend en charge une DI-contexte).
À utiliser il peut se connecter à partir d'Mondiale.asax.cs:
Peuvent ensuite utiliser cela à la place du HttpContext.Actuel:
Il y a peut-être des questions que je ne comprends pas ce liées répondre. S'il vous plaît commentaire.
Référence: AsyncLocal (nécessite .NET 4.6)
Veuillez consulter l'article suivant pour une explication sur les raisons de la variable de Session est nulle, et les solutions de contournement possibles
http://adventuresdotnet.blogspot.com/2010/10/httpcontextcurrent-and-threads-with.html
de la cité à partir de l'article;
Et comme un projet de contourner l'auteur dit
Lors de l'utilisation de threads ou un
async
fonction,HttpContext.Current
n'est pas disponible.Essayez d'utiliser:
Une fois que vous
current
avec une instance appropriée, le reste de votre code est indépendant, qu'on l'appelle à partir d'un thread ou directement à partir d'unWebRequest
.