Pregunta

Me pregunto cómo se mantiene el HttpContext dado que la naturaleza de solicitud-respuesta de la web es esencialmente sin estado.

¿Se está enviando un identificador para el objeto HttpContext como parte de los campos ocultos __EVENTTarget / __EVENTARGUMENTS para que la clase HttpRuntime pueda crear la clase HttpContext leyendo esta sección de la solicitud (HttpWorkerRequest)? No pienso

Avíseme, ya que estoy tratando de llenar algunos agujeros en mi comprensión de la canalización http y no pude encontrar ninguna información al respecto.

Entiendo algo como HttpContext.Current.Session [& Quot; myKey & Quot;] = Value;

simplemente funciona, pero si tuviera que hacer algo similar en un idioma diferente (por ejemplo, perl), tendría que usar campos ocultos para el mismo, ¿no?

Gracias -Venu

¿Fue útil?

Solución

El HttpContext se recrea para cada solicitud. La HttpSession, sin embargo, se almacena en el servidor a través de solicitudes. Básicamente, HttpSession es un Dictionary & Lt; string, Dictionary & Lt; string, object & Gt; & Gt ;. La clave inicial, la identificación de la sesión, la proporciona una cookie o un parámetro de cadena de consulta (si se utilizan sesiones sin cookies). Si usa Fiddler, verá la cookie ASP.NET_SessionId que contiene la clave para la sesión de ese usuario.

En código:

class HttpSessionState {
   private static readonly Sessions = 
     new Dictionary<string, Dictionary<string, object>>();

   public object this(string key) {
      get {
         return GetCurrentUserSession()[key]
      }
      set {
         GetCurrentUserSession()[key] = value;
      }
   }

   private Dictionary<string, object> GetCurrentUserSession() {
      var id = GetCurrentUserSessionId[]
      var d = Sessions[id];
      if (d == null) {
         d = new Dictionary<string, object>();
         Sessions[id] = d;
      }
      return d;
   }

   private string GetCurrentUserSessionId() {
      return HttpContext.Current.Request.Cookies["ASP.NET_SessionId"].Value;
   }
}

La implementación real también maneja tiempos de espera de sesión, abandonos y sesiones sin cookies, pero la idea básica es la misma.

Otros consejos

No creo que haya una respuesta a su pregunta, porque no creo que todo bajo el paraguas HttpContext funcione de la misma manera. En el ejemplo que eligió, estado de sesión, tanto la clave como el valor se almacenan en el lado del servidor. La forma en que sabe conectar futuras solicitudes a ese estado de sesión es mediante el uso de una cookie que tiene una clave (totalmente diferente). Cuando el navegador realiza otra solicitud, envía esta cookie con la solicitud y el servidor la usa para determinar a qué sesión asignar. Una vez que lo resuelve, nuevamente tiene acceso a su diccionario, a través de las respuestas.

Entonces, para hacerlo en perl, desearía crear manualmente una cookie y almacenar una clave única en ella, tener una asignación del lado del servidor de esas claves únicas a los diccionarios de estado de sesión, y hacer más o menos lo que describí arriba.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top