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 est SendData(). Cela envoie des données à un autre serveur. Je suis juste confus pourquoi le HttpContect.Current devient null sur le rappel.
  • Veuillez voir ma réponse pour une explication sur le pourquoi de ce qui se passe
InformationsquelleAutor Serge P | 2014-07-03