2010-12-27 19 views
5

Ho un caricamento di file nel mio sito che viene eseguito utilizzando uploadify utilizza una pagina ashx per caricare il file nel database. Funziona bene in IE ma in Mozilla il contesto.Session sta diventando nullo . Ho anche usato IReadOnlySessionState per leggere la sessione.Uploadify file ashx Context.Session diventa null

come posso ottenere una sessione in Mozilla come IE.

Ecco il codice ashx ho fatto

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 
      } 
     } 
    } 
} 

In IE Context.Session["User"] hanno sempre il valore, ma in Mozilla si è sempre nullo

+0

Probabilmente una domanda stupida, ma hai abilitato i cookie in Mozilla? –

+0

sì .. il cookie è abilitato – deepu

+0

@deepu, potresti mostrare parti rilevanti del tuo codice (client e server)? –

risposta

11

È necessario aggiungere sessionId per caricare i parametri post e ripristinare il cookie ASP.NET_SessionId sul lato server su global.asax su OnBeginRequest. In realtà è bug with flash and cookies.

ho creato il modulo per la sessione e cookie di autenticazione di ripristino, per ottenere il lavoro flash e sessione di asp.net, quindi penso che sarà utile per la vostra:

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); 
    } 
} 

anche di quanto è necessario registrarsi al di sopra del modulo a web.config:

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

Puoi spiegarci di più su questo metodo. – deepu

+0

Questo è httpModule che su ogni richiesta di avvio verifica il parametro 'ASPSESSID' e se è stato trovato un parametro che ricrea il cookie. È tutto. –

+0

okz ... grazie fammi vedere – deepu

0

E 'probabile che sia qualcosa di non riuscire a essere impostato dal server o rimandato sul client.

Passo indietro ad un livello più basso - utilizzare uno strumento di diagnostica di rete come Fiddler o Wireshark per esaminare il traffico inviato al/dal server e confrontare le differenze tra IE e Firefox.

Controllare le intestazioni per assicurarsi che i cookie e i valori del modulo vengano inviati al server come previsto.

0

ho creato una funzione per controllare la sessione scaduta e quindi passare tale come parametro nello script-dati del file di ASHX uploadify e posso controllare quel parametro per vedere se esiste o no sessione. se restituisce la sessione è scaduta, quindi il caricamento non avrà luogo. Ha funzionato per me. Non ho trovato problemi con questo. speranza che risolvere il mio problema

1

Context.Session is null .. perché il collegamento ad HttpHandler ha un altro Context.Session
(debug e provare: Context.Session.SessionId in cui è il FileInput è diverso da Context.Session.SessionId in Upload.ashx)!

suggerisco una soluzione: passare un riferimento per gli elementi necessari nella seconda sessione (nel mio esempio mi passa l'originale SessionId utilizzando variabili sessionId)

.... 
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")%>', 
.... 

e utilizzare questo articolo nel Ashx file.

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

Se necessità di condividere elementi complessi utilizzare Context.Application invece di Context.Session, utilizzando IDSessione originale: Context.Application["SharedElement"+SessionID]

0

Ho avuto un problema simile con un file Ashx.La soluzione era che il gestore deve implementare IReadOnlySessionState (per accesso in sola lettura) o IRequiresSessionState (per accesso in lettura-scrittura). es .:

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

Queste interfacce non richiedono alcun codice aggiuntivo ma fungono da indicatori per il framework.

Spero che questo aiuti.

Jonathan