2010-12-27 15 views
5

मेरे पास मेरी साइट में एक फ़ाइल अपलोड है जो अपलोडिफ़ाई का उपयोग करके किया जाता है, यह डेटाबेस में फ़ाइल अपलोड करने के लिए एशक्स पेज का उपयोग करता है। यह आईई में ठीक काम करता है लेकिन मोज़िला में संदर्भ। सत्र शून्य हो रहा है मैंने सत्र पढ़ने के लिए IReadOnlySessionState का भी उपयोग किया है।एएसएक्स फ़ाइल को अपलोड करें Context.Session शून्य हो जाता है

मैं आईओ जैसे मोज़िला में सत्र कैसे प्राप्त कर सकता हूं।

यहाँ ashx कोड मैं

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

किया है आईई Context.Session["User"] में है हमेशा मूल्य है, लेकिन मोज़िला में यह हमेशा शून्य है

+0

शायद एक बेवकूफ सवाल है लेकिन क्या आपने मोज़िला में कुकीज़ सक्षम की हैं? –

+0

हाँ .. कुकी सक्षम है – deepu

+0

@ डीपू, क्या आप अपने कोड (क्लाइंट और सर्वर) के प्रासंगिक हिस्सों को दिखा सकते हैं? –

उत्तर

11

आपको पोस्ट पैरा को अपलोड करने के लिए sessionId जोड़ने और OnBeginRequest पर global.asax पर सर्वर पक्ष पर ASP.NET_SessionId कुकी को पुनर्स्थापित करने की आवश्यकता है। यह वास्तव में bug with flash and cookies है।

मैं सत्र और प्रमाणन कुकी, बहाल काम फ्लैश और asp.net सत्र पाने के लिए मॉड्यूल बनाया है, इसलिए मुझे लगता है कि यह आपके लिए उपयोगी होगा:

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

भी की तुलना में आप पर मॉड्यूल ऊपर रजिस्टर की जरूरत है web.config:

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

क्या आप इस विधि के बारे में और बता सकते हैं। – deepu

+0

यह httpModule है कि प्रत्येक प्रारंभ अनुरोध पर 'ASPSESSID' पैरामीटर की जांच करें और यदि पैरामीटर को पुन: बनाने से पैरामीटर पाया गया है। बस इतना ही। –

+0

okz ... धन्यवाद मुझे – deepu

0

यह कुछ सर्वर द्वारा सेट किया जा करने में नाकाम रहने होने की संभावना है या ग्राहक पर वापस भेजा गया।

वापस एक निचले स्तर के लिए कदम - यातायात की जांच के लिए इस तरह के रूप Fiddler या Wireshark एक नेटवर्क नैदानिक ​​उपकरण का उपयोग अपने सर्वर से/भेजा है और IE और Firefox के बीच मतभेद की तुलना की जा रही।

शीर्षकों को यह सुनिश्चित करने के लिए देखें कि कुकीज और फॉर्म मानों को सर्वर पर वापस भेजा जा रहा है।

0

मैं सत्र की जांच करने के एक समारोह बनाया है समाप्त हो गए हैं और उसके बाद से पारित uploadify और में ashx फ़ाइल की पटकथा डेटा में पैरामीटर के रूप मैं जाँच करें कि पैरामीटर देखने के लिए कि सत्र मौजूद है या नहीं। यदि यह सत्र समाप्त हो गया है तो अपलोड समाप्त हो जाएगा। यह मेरे लिए काम किया। इसका उपयोग करके कोई समस्या नहीं मिली। जो कि मेरी समस्या

1

Context.Session is null .. हल उम्मीद क्योंकि HttpHandler के लिए कनेक्शन एक और Context.Session
है (डिबग और कोशिश: जहां fileInput है में Context.Session.SessionId Upload.ashx में Context.Session.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")%>', 
.... 

(मेरी नमूने में मैं sessionId चर का उपयोग कर मूल SessionId पारित) और .ashx में इस आइटम का उपयोग करें फ़ाइल।

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

आप जटिल तत्व साझा करने की आवश्यकता Context.Session के बजाय Context.Application, मूल SessionID का उपयोग कर का उपयोग करते हैं: Context.Application["SharedElement"+SessionID]

0

मैं एक .ashx फ़ाइल के साथ एक समान समस्या थी।समाधान यह था कि हैंडलर को IReadOnlySessionState (केवल पढ़ने के लिए पहुंच के लिए) या IRequiresSessionState (रीड-राइट एक्सेस के लिए) को कार्यान्वित करना है। उदाहरण:

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

इन इंटरफेस को किसी भी अतिरिक्त कोड की आवश्यकता नहीं है लेकिन ढांचे के लिए मार्कर के रूप में कार्य करें।

आशा है कि इससे मदद मिलती है।

जोनाथन

संबंधित मुद्दे