2010-12-27 12 views
5

Mam plik do przesłania na moją stronę, która odbywa się za pomocą uploadify używa strony ashx do przesłania pliku do bazy danych. Działa dobrze w IE, ale w Mozilli kontekst. Sesja jest zerowa . Używam także IReadOnlySessionState do czytania sesji.Uploadify ashx Context.Session dostaje null

Jak mogę uzyskać sesję w Mozilli jak IE.

oto kod ashx mam zrobić

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

W IE Context.Session["User"] zawsze mają wartość, ale w Mozilli jest zawsze zerowa

+0

Prawdopodobnie głupie pytanie, ale czy w Mozilli masz włączone pliki cookie? –

+0

yes .. cookie jest włączone – deepu

+0

@deepu, czy możesz pokazać odpowiednie części swojego kodu (klienta i serwera)? –

Odpowiedz

11

Musisz dodać identyfikator sesji, aby załadować parametry postów i przywrócić plik cookie ASP.NET_SessionId po stronie serwera na global.asax w OnBeginRequest. W rzeczywistości jest to bug with flash and cookies.

Stworzyłem modułu do sesji i auth ciasteczka przywrócenia do pracy i dostać błysk sesji ASP.NET, więc myślę, że będzie użyteczny dla:

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

Również niż trzeba zarejestrować powyżej w module web.config:

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

Czy możesz wyjaśnić więcej na temat tej metody. – deepu

+0

To jest httpModule, który na każdym uruchomieniu żądania sprawdza parametr "ASPSESSID" i jeśli znaleziono parametr niż odtwarzanie pliku cookie. To wszystko. –

+0

okz ... dziękuję daj mi zobaczyć – deepu

0

To może być coś uszkodzoną być ustawiona przez serwer lub odesłany do klienta.

Powrót do niższego poziomu - użyj narzędzia diagnostycznego sieci, takiego jak Fiddler lub Wireshark, aby sprawdzić ruch przesyłany do/z serwera i porównać różnice między IE i Firefox.

Sprawdź nagłówki, aby upewnić się, że pliki cookie i wartości formularzy są wysyłane z powrotem do serwera zgodnie z oczekiwaniami.

0

stworzyłem funkcję by sprawdzić sesji wygasły, a następnie przekazać, że jako parametr skryptu-danych Uploadify oraz w pliku ashx i sprawdzić, czy parametr, aby zobaczyć, czy sesja istnieje, czy nie. jeśli sesja się zakończy, przesyłanie nie nastąpi. To zadziałało dla mnie. Nie znaleziono żadnych problemów z tym związanych. nadzieję, że rozwiąże mój problem

1

Context.Session is null .. ponieważ połączenie HttpHandler ma inny Context.Session
(debug i spróbuj: Context.Session.SessionId w którym jest fileInput różni się od Context.Session.SessionId w Upload.ashx)!

Proponuję Obejście: przekazać odwołanie do elementów potrzebnych w drugiej sesji (w moim próbki mijam oryginalny SessionId użyciu sessionid zmiennej)

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

i wykorzystywać te elementy w .ashx plik.

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

Jeśli potrzeba dzielenia złożonych elementów użyć Context.Application zamiast Context.Session, z wykorzystaniem oryginalnego SessionID: Context.Application["SharedElement"+SessionID]

0

miałem podobny problem z plikiem .ashx.Rozwiązaniem było to, że program obsługi musi implementować IReadOnlySessionState (dla dostępu tylko do odczytu) lub IRequiresSessionState (dla dostępu do odczytu i zapisu). np .:

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

Te interfejsy nie potrzebują dodatkowego kodu, ale działają jako znaczniki dla frameworka.

Mam nadzieję, że to pomoże.

Jonathan