【问题标题】:ASP.NET Generic Handlers & SessionASP.NET 通用处理程序和会话
【发布时间】: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?以及如何发送?

标签: c# jquery asp.net session generic-handler


【解决方案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["StackOverflow"] = "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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多