如何在 aspx 中访问在 ashx 中修改的会话
本文关键字:修改 会话 ashx 访问 aspx | 更新日期: 2023-09-27 17:55:20
我正在使用uploadify上传文件,它们会自动发布到处理程序。 然后,我在处理程序中修改会话,该处理程序已设置为网站公共类中的静态属性。 然后,我尝试在 aspx 页中访问同一会话,该值为 null。 我有一种感觉,这是因为 cookie,但需要有一种方法来解决这个问题,而不会在 url 中暴露会话 ID。
阿什克斯:
public class Upload : IHttpHandler, IReadOnlySessionState, IRequiresSessionState
{
public void ProcessRequest(HttpContext context)
{
...
CMSSession.Current.UploadedFiles.Add(fileName);
}
}
会话类:
public class CMSSession
{
public static CMSSession Current
{
get
{
CMSSession session = (CMSSession)HttpContext.Current.Session["__CMSSession__"];
if (session == null)
{
session = new CMSSession();
HttpContext.Current.Session["__CMSSession__"] = session;
}
return session;
}
}
public List<string> UploadedFiles { get; set; }
}
.ASPX:
if (CMSSession.Current.UploadedFiles != null)
{
...
}
else
{
IT'S ALWAYS NULL
}
网络配置:
<sessionState mode="InProc" cookieless="false" /> - causes session to always null in aspx when modified in ashx
<sessionState mode="InProc" cookieless="true" /> - session value is not null, but sessionid is exposed in the url
如何在不将 cookieless 更改为 true 的情况下访问和修改 ASHX 文件中的当前会话,然后从 ASPX 页面访问会话?
我尝试使用HttpContext并使用传递到ASHX的上下文...什么都没用。
与此问题相同,但必须有一种更安全的方法:会话在 ASX 中设置并在 ASPX 上获取该会话
有什么想法吗?
我找到了答案:当从 FLASH 调用处理程序(如 swfupload 或 uploadify)时,它不会将当前会话 ID 传递给处理程序。 然后,处理程序创建一个 NEW 会话。 要解决此问题,请执行以下操作:
您的用户界面:JavaScript:
$(Selector).uploadify({
swf: 'uploadify.swf',
uploader: 'Upload.ashx?ASPSESSID=<%=Session.SessionID%>'
});
添加到: Global.asax:
void Application_BeginRequest(object sender, EventArgs e)
{
try
{
string session_param_name = "ASPSESSID";
string session_cookie_name = "ASP.NET_SESSIONID";
string session_value = Request.Form[session_param_name] ?? Request.QueryString[session_param_name];
if (session_value != null) { UpdateCookie(session_cookie_name, session_value); }
}
catch (Exception) { }
}
void UpdateCookie(string cookie_name, string cookie_value)
{
HttpCookie cookie = HttpContext.Current.Request.Cookies.Get(cookie_name);
if (cookie == null)
{
HttpCookie cookie1 = new HttpCookie(cookie_name, cookie_value);
Response.Cookies.Add(cookie1);
}
else
{
cookie.Value = cookie_value;
HttpContext.Current.Request.Cookies.Set(cookie);
}
}
取而简化上传自:http://snipplr.com/view/15180/
如果使用表单身份验证,则可能需要使用身份验证:
&AUTHID=<%= Request.Cookies[FormsAuthentication.FormsCookieName] == null ? "" : Request.Cookies[FormsAuthentication.FormsCookieName].Value %>
将其附加到 jQuery 中的上传器参数。
然后将以下内容添加到全局:
try
{
string auth_param_name = "AUTHID";
string auth_cookie_name = FormsAuthentication.FormsCookieName;
string auth_value = Request.Form[auth_param_name] ?? Request.QueryString[auth_param_name];
if (auth_value != null) { UpdateCookie(auth_cookie_name, auth_value); }
}
catch (Exception) { }
您现在可以从IE,Chrome,FF等中的处理程序(即使使用我在问题中使用的静态会话对象)访问相同的会话。
Context.Session is null
..因为与HttpHandler
的连接还有另一种Context.Session
(调试并尝试:Context.Session.SessionId
在哪里,文件输入与 Upload.ashx 中的Context.Session.SessionId
不同)!
建议一个解决方法:传递对第二个会话中所需元素的引用(在我的示例中,我使用 sessionId 变量传递原始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")%>',
....
并在 .ashx 文件中使用此项目。
public void ProcessRequest(HttpContext context)
{
try
{
HttpPostedFile file = context.Request.Files["Filedata"];
string sessionId = context.Request["sessionId"].ToString();
....
如果需要共享复杂元素,请使用 Context.Application 而不是 Context.Session,使用原始 SessionID: Context.Application["SharedElement"+SessionID]