触发 SignalR 方法时 HttpContext.Current.Request.Cookies 出现空异常

Null exception on HttpContext.Current.Request.Cookies when firing SignalR method

我遇到了一个奇怪的问题,我似乎无法弄清楚甚至无法正确理解。

基本上我有一个基本的授权方法,可以获取安全令牌 (cookie) 并将其与当前登录的用户进行比较。当从 SignalR 方法触发它时,它会抛出一个空异常,但我知道用户有安全令牌。这在没有 SignalR 的情况下工作正常。

我将提供代码等。以帮助理解问题。

架构:

  1. 业务层
  2. 表示层

//Located within the business layer
public static User getUserBySecurityToken()
{
   string securityToken = "";
   if (HttpContext.Current.Request.Cookies["SecurityToken"] != null)
   {
     securityToken = HttpContext.Current.Request.Cookies["SecurityToken"].Value.ToString();                                                   
   } 

   return user;
}

//Located within the presentation layer (hubs)
public void Arrange(int tid, string status, string content) 
{
     //Get logged on user
    Business.User user = Business.User.getUserBySecurityToken();
    if (user != null)
    {
        Clients.Group(user.campaignName).changeTicket(tid, status, content);
    }

}

//Located within the presentation layer (client side script)
$(document).on('click', '.move-option-js', function (e) {
    //This does not even get called due to cookie being null
    window.hubReady.done(function ()
    {
        panelHub.server.arrange(i, s, content);
    });
});

请注意,为了便于阅读,我省略了一些代码。我希望我能更好地理解这个问题,并可能稍微重构代码以使其正常工作。

编辑

经过更多测试后,一切正常,第一次运行完美,但之后就失败了。

据我所知,问题是 SingalR 运行 在它自己的线程中,而我的 SecurityToken 方法在主线程中运行。所以在第一个页面加载后主线程不再存在,所以你必须在 SignalR 上下文中编程。

我通过重载我的原始方法并传入 SignalR 上下文 Cookie 请求解决了这个问题。代码如下:

class 的作品继承自 Hub。

Context.RequestCookies["SecurityToken"].Value.ToString()

希望这对未来的读者有所帮助。

此致,