ASP.NET 通用处理程序和会话

Posted

技术标签:

【中文标题】ASP.NET 通用处理程序和会话【英文标题】:ASP.NET Generic Handlers & Session 【发布时间】:2011-06-20 20:08:57 【问题描述】:

我对 GenericHandler 和 anonymousIdentification 有疑问。

基本上,如果<anonymousIdentification enabled="true" /> 在 web 配置中打开,则每当向服务器发送 JQuery GET/POST 请求时,该请求都会在新用户和新用户会话下执行。

有没有办法缓解这种情况?我需要访问当前用户的会话变量...真是令人沮丧!

【问题讨论】:

我没有检查它,但我想如果你发送一个 jQuery GET 请求。从客户端然后它在当前用户上下文中处理.. 用提琴手检查正常和 jquery 请求的 ASP.net 会话 cookie 是否相同 所以如果你关闭匿名 ID 是否有效?您使用的是表单身份验证吗?您可以在 web.config 中关闭该特定路径的匿名功能吗? 我会尝试看看这是否有效@drachenstern。你错了@Shekhar_Pro。我将用户数据存储在会话中;一个值是 UserRegistratinoState。如果我来自用户刚刚注册的页面,则会话中的枚举值为 UserRegistrationState.Registered。我已经验证了这一点。但是,当我在另一个页面上从 js 调用处理程序时,处理程序中的第一行代码会检查该会话变量。如果变量不存在,它会自动返回 UserRegistrationState.Anonymous。我认为可以安全地假设来自 JQuery 的 Get 请求是在新用户下执行的。 发生的事情是他们没有将 cookie 发送回服务器。 那么我该如何缓解呢?我要发送哪个 cookie?以及如何发送? 【参考方案1】:

通用处理程序必须实现IReadOnlySessionState 接口才能访问会话变量。如果还需要写会话变量,实现IRequiresSessionState

【讨论】:

我马上试试这个。谢谢@Josh Stodola 应为:public class MemberHandler:IHttpHandler,IRequiresSessionState 我遇到的问题是,如果对处理程序的请求是第一个到网站的请求(没有实际会话 ID),处理程序没有发回会话 cookie,我认为当 IReadOnlySessionState 派生自“IRequireSessionState”时那就够了。但我真的不得不明确地使用IRequireSessionState。谢谢你的帖子。【参考方案2】:

实现System.Web.SessionState.IRequiresSessionState接口:

public class Handler : IHttpHandler, System.Web.SessionState.IRequiresSessionState 
   
  public void ProcessRequest(HttpContext context)  
        
    context.Session["***"] = "overflowing";      
    context.Response.Redirect("~/AnotherPage.aspx");      
  


【讨论】:

我想在通用处理程序中获取会话值,以根据我存储在会话中的主键上传图像,我正在使用 jquery 图像上传插件,它绑定了文档上的所有属性准备就绪。我在我的处理程序代码中使用了 iRequiresSessionState 但我仍然无法访问会话值。会话密钥仍为 0。谁能告诉我这个?【参考方案3】:

你可以用这个:

public class Handler : 
    IHttpHandler, 
    System.Web.SessionState.IReadOnlySessionState

【讨论】:

【参考方案4】:

我建议您在网络浏览器中启用开发者模式下的网络选项卡。 然后在 AJAX 中检查发送了哪个 cookie(如果有)。

如果您没有看到任何 cookie,则意味着浏览器没有获得任何会话,因此您应该确保(如 Josh 所述)继承正确的接口并访问 cookie。 (别忘了使用 System.Web.SessionState)

为了生成cookie,访问会话对象的sessionID:

string sesId = context.Session.SessionID;

之前写任何东西到响应中。

【讨论】:

-1 拥有无 cookie 会话状态是非常可能和合理的,并且访问标识符当然不会“生成” cookie

以上是关于ASP.NET 通用处理程序和会话的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET 中的 FluentNHibernate 会话管理

在 ASP.Net 应用程序中实现通用错误处理的简单方法

使用 SignalR、WCF 双工服务和 ASP.Net 通用处理程序向客户端推送通知?

支持 JSONP 的 ASP.NET 通用 HTTP 处理程序 (.ashx)

如何在 ASP.NET MVC 中使用通用处理程序 (ASHX)?

与 windows 服务共享 asp.net mvc 会话