基于jQuery和Flash的多文件上传插件uploadify的确很好用。好了,既然找到问题的根源,我们就想办法让服务器在session判空之前将session值手动传递过去。
在ASP.NET中的解决方案如下:
在上传的那个页面中加入以下代码 var auth = "<% = Request.Cookies[FormsAuthentication.FormsCookieName]==null ? string.Empty : Request.Cookies[FormsAuthentication.FormsCookieName].Value %>"; var ASPSESSID = "<%= Session.SessionID %>"; 然后初始化插件的代码改成如下形式 view sourceprint?$("#fileInput1").uploadify({ 'uploader': '/Scripts/uploader/uploadify.swf', 'method': 'GET', 'script': '/mystudio/GoUploadAvatar', 'cancelImg': '/Scripts/uploader/cancel.png', 'sizeLimit': 2048000, 'multi': false, 'fileDesc': '选择jpg,png,gif', 'fileExt': '*.jpg;*.png;*.gif', 'onComplete': function (e, queueId, fileObj, response, data) { },
'scriptData': { 'ASPSESSID': ASPSESSID, 'AUTHID': auth },
'onSelectOnce': function (e, data) { $('#fileInput1').uploadifySettings('scriptData', { 'ASPSESSID': ASPSESSID, 'AUTHID': auth }); } }); 注意上面有一句,很关键 $('#fileInput1').uploadifySettings('scriptData', { 'ASPSESSID': ASPSESSID, 'AUTHID': auth });
接下来我们必须在服务端Session判空并创建之前,将传递过来的SessonID强制赋给当前请求的Cookies,这样服务端就认为还是原来的Session传递过来了。具体做法我们可以在Global.asax文件中加入如下代码:
protected void Application_BeginRequest(object sender, EventArgs e) { /* 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 (HttpContext.Current.Request.Form[session_param_name] != null) { UpdateCookie(session_cookie_name, HttpContext.Current.Request.Form[session_param_name]); } else if (HttpContext.Current.Request.QueryString[session_param_name] != null) { UpdateCookie(session_cookie_name, HttpContext.Current.Request.QueryString[session_param_name]); } } catch { } try { string auth_param_name = "AUTHID"; string auth_cookie_name = FormsAuthentication.FormsCookieName; if (HttpContext.Current.Request.Form[auth_param_name] != null) { UpdateCookie(auth_cookie_name, HttpContext.Current.Request.Form[auth_param_name]); } else if (HttpContext.Current.Request.QueryString[auth_param_name] != null) { UpdateCookie(auth_cookie_name, HttpContext.Current.Request.QueryString[auth_param_name]); } } catch { } } private void UpdateCookie(string cookie_name, string cookie_value) { HttpCookie cookie = HttpContext.Current.Request.Cookies.Get(cookie_name); if (null == cookie) { cookie = new HttpCookie(cookie_name); } cookie.Value = cookie_value; HttpContext.Current.Request.Cookies.Set(cookie); }
这时候你访问上传文件的那个页面时可能会报“会话状态已创建一个会话 ID,但由于响应已被应用程序刷新而无法保存它”的错误,这时,你可以在web.config文件改变session的存储方式,一般默认都是以 “inproc”存储的,我们把它改成stateserver模式,即在system.web节点下加入
<sessionstate mode="StateServer" stateconnectionstring="tcpip=127。希望能给遇到同样问题的朋友一点帮助。当然如果你有更好的解决方案,可以留言告诉我,不胜感激。