Cercando di accedere al HttpContext.Current
in una chiamata di metodo indietro così posso modificare una variabile Session
, tuttavia ricevo l'eccezione che è HttpContext.Current
null
. Il metodo di callback viene attivato in modo asincrono, quando l'oggetto _anAgent
lo attiva.HttpContext.Current è nullo in un callback asincrono
Sono ancora incerto sulla soluzione a questo dopo aver visualizzato similarquestions su SO.
Una versione semplificata del mio codice è in questo modo:
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"]
}
}
Non sono sicuro se necessario, ma la mia classe WorkAgent
assomiglia così:
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);
}
}
Cosa succede nel codice:
Cliccando su un pulsante si chiama il metodo SendData()
, all'interno di questo il _webAgent
invia un messaggio ad un altro server e attende la risposta (nel frattempo l'utente può comunque interagire con questa pagina e fare riferimento allo stesso SessionID
). Una volta ricevuto, chiama il metodo BackendReceived()
che, nella pagina .aspx.cs, chiama il metodo Callback()
.
Domanda:
Quando il WorkAgent
innesca il metodo Callback()
si tenta di accedere HttpContext.Current
che è null
. Perché è così quando, se continuo, ignorando l'eccezione, posso ancora ottenere lo stesso SessionID
e la variabile Session
utilizzando il metodo restituito ajax GetSessionVar()
.
Devo abilitare l'impostazione aspNetCompatibilityEnabled?
Devo creare una specie di asynchronous module handler?
E 'collegato a Integrated/Classic mode?
perché complicare questo utilizzando callback, una soluzione migliore potrebbe essere quella di utilizzare ajax dal lato client, in questo modo l'utente può comunque interagire con il sito. E la chiamata all'altro sistema può essere semplicemente una normale chiamata di metodo – 3dd
Ajax * è * utilizzato dal lato client per la maggior parte, semplicemente non lo include nel codice sopra (aggiorna le variabili 'HttpContext Session' e il database SQL) . L'unico metodo che non è una chiamata Ajax è 'SendData()'. Questo invia i dati a * qualche altro * server. Sono solo confuso perché il 'HttpContect.Current' diventa ** null ** sul callback. –
Si prega di vedere la mia risposta per una spiegazione sul perché questo sta accadendo – 3dd