我有一个奇怪的问题,我似乎无法弄清楚甚至不能正确理解。
基本上我有一个基本的授权方法,它获取安全令牌(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);
});
});
请注意我省略了一些可读性代码。我希望我能更好地理解这个问题,并且可能会稍微重新考虑代码以使其正常工作。
EDITS
经过更多的测试,一切都很好,第一次工作完美,但之后就失败了。
答案 0 :(得分:0)
据我所知,问题是SingalR在其自己的线程中运行,而我的SecurityToken方法在主线程中运行。所以在第一页加载后主线程不再存在,所以你必须在SignalR Context中编程。
我通过重载原始方法并传入SignalR上下文Cookie请求来修复此问题。代码如下:
继承自Hub的类的作品。
Context.RequestCookies["SecurityToken"].Value.ToString()
希望这有助于未来的读者。
此致