2010-12-27 9 views
5

Tengo una carga de archivo en mi sitio que se realiza usando uploadify usa una página ashx para subir archivos a la base de datos. Funciona bien en IE pero en Mozilla el contexto. La sesión se vuelve nula . También he usado IReadOnlySessionState para leer la sesión.Uploadify archivo ashx Context.Session gets null

¿cómo puedo obtener la sesión en Mozilla como IE.

Este es el código ashx he hecho

public class Upload : IHttpHandler, IReadOnlySessionState 
{  
    HttpContext context; 
    public void ProcessRequest(HttpContext context) 
    { 
     string UserID = context.Request["UserID"]; 

     context.Response.ContentType = "text/plain"; 
     context.Response.Expires = -1; 
     XmlDocument xDoc = new XmlDocument(); 
     HttpPostedFile postedFile = context.Request.Files["Filedata"]; 
     try 
     { 
      if (context.Session["User"] == null || context.Session["User"].ToString() == "") 
      { 
       context.Response.Write("SessionExpired"); 
       context.Response.StatusCode = 200; 
      } 
      else 
      { 
        // does the uploading to database 
      } 
     } 
    } 
} 

En IE Context.Session["User"] siempre tienen el valor, pero en Mozilla siempre es nula

+0

Probablemente sea una pregunta estúpida, pero ¿ha habilitado las cookies en Mozilla? –

+0

sí ... la cookie está habilitada – deepu

+0

@deepu, ¿podría mostrar partes relevantes de su código (cliente y servidor)? –

Respuesta

11

Necesita agregar sessionId para cargar post params y restaurar la cookie ASP.NET_SessionId en el servidor en global.asax en OnBeginRequest. En realidad es bug with flash and cookies.

He creado el módulo de sesión y cookies de autenticación de restauración, para obtener Flash sesión de trabajo y asp.net, así que creo que será útil para su:

public class SwfUploadSupportModule : IHttpModule 
{ 
    public void Dispose() 
    { 
     // clean-up code here. 
    } 

    public void Init(HttpApplication application) 
    { 
     application.BeginRequest += new EventHandler(OnBeginRequest); 
    } 

    private void OnBeginRequest(object sender, EventArgs e) 
    { 
     var httpApplication = (HttpApplication)sender; 

     /* we guess at this point session is not already retrieved by application so we recreate cookie with the session id... */ 
     try 
     { 
      string session_param_name = "ASPSESSID"; 
      string session_cookie_name = "ASP.NET_SessionId"; 
      if (httpApplication.Request.Form[session_param_name] != null) 
      { 
       UpdateCookie(httpApplication, session_cookie_name, httpApplication.Request.Form[session_param_name]); 
      } 
      else if (httpApplication.Request.QueryString[session_param_name] != null) 
      { 
       UpdateCookie(httpApplication, session_cookie_name, httpApplication.Request.QueryString[session_param_name]); 
      } 
     } 
     catch 
     { 
     } 

     try 
     { 
      string auth_param_name = "AUTHID"; 
      string auth_cookie_name = FormsAuthentication.FormsCookieName; 

      if (httpApplication.Request.Form[auth_param_name] != null) 
      { 
       UpdateCookie(httpApplication, auth_cookie_name, httpApplication.Request.Form[auth_param_name]); 
      } 
      else if (httpApplication.Request.QueryString[auth_param_name] != null) 
      { 
       UpdateCookie(httpApplication, auth_cookie_name, httpApplication.Request.QueryString[auth_param_name]); 
      } 
     } 
     catch 
     { 
     }    
    } 

    private void UpdateCookie(HttpApplication application, string cookie_name, string cookie_value) 
    { 
     var httpApplication = (HttpApplication)application; 

     HttpCookie cookie = httpApplication.Request.Cookies.Get(cookie_name); 
     if (null == cookie) 
     { 
      cookie = new HttpCookie(cookie_name); 
     } 
     cookie.Value = cookie_value; 
     httpApplication.Request.Cookies.Set(cookie); 
    } 
} 

Además de lo que necesita registro anterior al módulo web.config:

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"> 
    <add name="SwfUploadSupportModule" type="namespace.SwfUploadSupportModule, application name" /> 
    </modules> 
</system.webServer> 
+0

¿Puede usted explicar más sobre este método? – deepu

+0

Este es httpModule que en cada solicitud de inicio comprueba el parámetro 'ASPSESSID' y si se encontró un parámetro que recrea la cookie. Eso es todo. –

+0

okz ... gracias déjame ver – deepu

0

Es probable que sea algo en su defecto que será establecido por el servidor o devuelto al cliente.

Regrese a un nivel inferior - use una herramienta de diagnóstico de red como Fiddler o Wireshark para examinar el tráfico que se envía a/desde su servidor y compare las diferencias entre IE y Firefox.

Mire los encabezados para asegurarse de que las cookies y los valores del formulario se envían al servidor como se esperaba.

0

he creado una función para comprobar la sesión ha expirado y que luego pase como parámetro en la secuencia de comandos de datos de archivo ashx uploadify y puedo comprobar que el parámetro para ver si existe o no la sesión. si la sesión de devolución ha expirado, no se realizará la carga. Funcionó para mí No encontré ningún problema al usar eso. esperanza de que resolver mi problema

1

Context.Session is null .. debido a la conexión a HttpHandler tiene otra Context.Session
(depuración y tratar: Context.Session.SessionId en dónde está el fileinput es diferente de Context.Session.SessionId en Upload.ashx)!

que sugieren una solución: pasar una referencia a los elementos que necesita en la segunda sesión (en mi muestra me pase el original SessionId usando sessionId variables)

.... 
var sessionId = "<%=Context.Session.SessionID%>"; 
var theString = "other param,if needed"; 
$(document).ready(function() { 
    $('#fileInput').uploadify({ 
     'uploader': '<%=ResolveUrl("~/uploadify/uploadify.swf")%>', 
     'script': '<%=ResolveUrl("~/Upload.ashx")%>', 
     'scriptData': { 'sessionId': sessionId, 'foo': theString }, 
     'cancelImg': '<%=ResolveUrl("~/uploadify/cancel.png")%>', 
.... 

y utilizar este artículos en .ashx archivo.

public void ProcessRequest(HttpContext context) 
{ 
    try 
    { 
     HttpPostedFile file = context.Request.Files["Filedata"]; 
     string sessionId = context.Request["sessionId"].ToString(); 
     .... 

Si necesidad de compartir elementos complejos Context.Application utiliza en lugar de Context.Session, utilizando SessionID el original: Context.Application["SharedElement"+SessionID]

0

He tenido un problema similar con un archivo .ashx.La solución fue que el controlador tiene que implementar IReadOnlySessionState (para acceso de solo lectura) o IRequiresSessionState (para acceso de lectura y escritura). por ejemplo:

public class SwfUploadSupportModule : IHttpHandler, IRequiresSessionState { ... } 

estas interfaces no es necesario ningún código adicional, sino que actúan como marcadores para el marco.

Espero que esto ayude.

Jonathan