触发SignalR方法时HttpContext.Current.Request.Cookies上出现空例外

时间:2015-01-01 07:40:50

标签: c# signalr

我有一个奇怪的问题,我似乎无法弄清楚甚至不能正确理解。

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

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

架构:

  1. 业务层
  2. 表示层
  3. //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);
        });
    });
    

    请注意我省略了一些可读性代码。我希望我能更好地理解这个问题,并且可能会稍微重新考虑代码以使其正常工作。

    EDITS

    经过更多的测试,一切都很好,第一次工作完美,但之后就失败了。

1 个答案:

答案 0 :(得分:0)

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

我通过重载原始方法并传入SignalR上下文Cookie请求来修复此问题。代码如下:

继承自Hub的类的作品。

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

希望这有助于未来的读者。

此致