当使用SignalR和传输模式长轮询时,Asp.net会话永不过期

前端之家收集整理的这篇文章主要介绍了当使用SignalR和传输模式长轮询时,Asp.net会话永不过期前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们有一个Web应用程序使用SignalR作为其通知机制。问题是当我们使用IE浏览我们的Web应用程序时,SignalR使用Long Polling作为其传输类型,从而将请求发送回我们的Web服务器,因此Session不会过期浏览器空闲。

我们认为也许我们可以在Global.asax中捕获请求,看看它们是否来自SingalR,并将会话超时设置为剩余时间(我不认为这是一个简单的解决方案)。

有没有其他的解决方案,我们失踪?

解决方法

我目前使用的解决方法是一个IHttpModule来检查请求是否是Signalr请求,如果删除了认证cookie,这将阻止ASP.net会话超时重置,因此如果您的会话超时为20分钟,并且唯一的请求是Signalr用户会话仍将超时,用户将不得不重新登录
  1. public class SignalRCookieBypassModule : IHttpModule
  2. {
  3. public void Init(HttpApplication application)
  4. {
  5. application.PreSendRequestHeaders += OnPreSendRequestHeaders;
  6. }
  7.  
  8. private bool IsSignalrRequest(string path)
  9. {
  10. return path.IndexOf("/signalr/",StringComparison.OrdinalIgnoreCase) > -1;
  11. }
  12.  
  13. protected void OnPreSendRequestHeaders(object sender,EventArgs e)
  14. {
  15. var httpContext = ((HttpApplication)sender).Context;
  16. if (IsSignalrRequest(httpContext.Request.Path))
  17. {
  18. // Remove auth cooke to avoid sliding expiration renew
  19. httpContext.Response.Cookies.Remove(DefaultAuthenticationTypes.ApplicationCookie);
  20. }
  21. }
  22.  
  23. public void Dispose()
  24. {
  25. }
  26. }

我觉得这是一个真正的黑客解决方案,所以,当数据从服务器推送到客户端时,或者当JavaScript客户端轮询端点数据时,所以会喜欢其他想法来阻止会话超时更新。

猜你在找的asp.Net相关文章