HttpContext.Current.Request.Cookie 上触发 SignalR 方法时的空异常
本文关键字:方法 异常 SignalR Request Current Cookie HttpContext | 更新日期: 2023-09-27 18:35:45
我遇到了一个奇怪的问题,我似乎无法弄清楚甚至无法正确理解。
基本上,我有一个基本的授权方法,该方法获取安全令牌(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 请求来解决此问题。代码如下:
从中心继承的类中的工作。
Context.RequestCookies["SecurityToken"].Value.ToString()
希望这对未来的读者有所帮助。
问候