触发 SignalR 方法时 HttpContext.Current.Request.Cookies 出现空异常
Null exception on HttpContext.Current.Request.Cookies when firing SignalR method
我遇到了一个奇怪的问题,我似乎无法弄清楚甚至无法正确理解。
基本上我有一个基本的授权方法,可以获取安全令牌 (cookie) 并将其与当前登录的用户进行比较。当从 SignalR 方法触发它时,它会抛出一个空异常,但我知道用户有安全令牌。这在没有 SignalR 的情况下工作正常。
我将提供代码等。以帮助理解问题。
架构:
- 业务层
- 表示层
//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()
希望这对未来的读者有所帮助。
此致,
我遇到了一个奇怪的问题,我似乎无法弄清楚甚至无法正确理解。
基本上我有一个基本的授权方法,可以获取安全令牌 (cookie) 并将其与当前登录的用户进行比较。当从 SignalR 方法触发它时,它会抛出一个空异常,但我知道用户有安全令牌。这在没有 SignalR 的情况下工作正常。
我将提供代码等。以帮助理解问题。
架构:
- 业务层
- 表示层
//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()
希望这对未来的读者有所帮助。
此致,