Asp.net mvc 获取对象引用未设置为Signal OnDisconnected内对象的实例
我试图通过用户名获取用户,我的代码在Asp.net mvc 获取对象引用未设置为Signal OnDisconnected内对象的实例,asp.net-mvc,signalr,Asp.net Mvc,Signalr,我试图通过用户名获取用户,我的代码在OnConnected方法中工作,但在OnDisconnected中,我获取的对象引用未设置为对象的实例这是我的代码: 在这里工作: public override async Task OnConnected() { var id = Context.ConnectionId; var userName = Context.User.Identity.Name; var connectedUser = new ChatUserMode
OnConnected
方法中工作,但在OnDisconnected
中,我获取的对象引用未设置为对象的实例
这是我的代码:
在这里工作:
public override async Task OnConnected()
{
var id = Context.ConnectionId;
var userName = Context.User.Identity.Name;
var connectedUser = new ChatUserModel();
var existingUserResponse = await _client.GetAsync("chats/users/" + userName + "/");
if (existingUserResponse.IsSuccessStatusCode)
{
var existingUserResult = existingUserResponse.Content.ReadAsStringAsync().Result;
var existingUser = JsonConvert.DeserializeObject<ChatUserModel>(existingUserResult);
existingUser.connectionId = id;
connectedUser = await AddOrUpdateUser(existingUser);
}
var response = await _client.GetAsync("chats/users");
var result = response.Content.ReadAsStringAsync().Result;
var users = JsonConvert.DeserializeObject<List<ChatUserModel>>(result);
Clients.Client(id).userConnected(users);
}
public override异步任务OnConnected()
{
var id=Context.ConnectionId;
var userName=Context.User.Identity.Name;
var connectedUser=new ChatUserModel();
var existingUserResponse=wait _client.GetAsync(“chats/users/”+userName+“/”);
if(existingUserResponse.IsSuccessStatusCode)
{
var existingUserResult=existingUserResponse.Content.ReadAsStringAsync().Result;
var existingUser=JsonConvert.DeserializeObject(existingUserResult);
existingUser.connectionId=id;
connectedUser=等待添加或更新用户(现有用户);
}
var response=wait_client.GetAsync(“聊天室/用户”);
var result=response.Content.ReadAsStringAsync().result;
var users=JsonConvert.DeserializeObject(结果);
Clients.Client(id).userConnected(users);
}
但不是在这里:
public override async Task OnDisconnected(bool stopCalled)
{
var userName = Context.User.Identity.Name;
try
{
var response = await _client.GetAsync("chats/users/" + userName + "/");
}
catch (Exception ex)
{
string msg = ex.Message;
}
//var existingUserResult = existingUserResponse.Content.ReadAsStringAsync().Result;
//var existingUser = JsonConvert.DeserializeObject<ChatUserModel>(existingUserResult);
//existingUser.connectionId = "";
//var connectedUser = await AddOrUpdateUser(existingUser);
}
public override异步任务OnDisconnected(bool stopCalled)
{
var userName=Context.User.Identity.Name;
尝试
{
var response=wait_client.GetAsync(“chats/users/”+userName+“/”);
}
捕获(例外情况除外)
{
字符串msg=例如消息;
}
//var existingUserResult=existingUserResponse.Content.ReadAsStringAsync().Result;
//var existingUser=JsonConvert.DeserializeObject(existingUserResult);
//existingUser.connectionId=“”;
//var connectedUser=await addor updateuser(现有用户);
}
OnDisconnect方法正在从服务器而不是从客户端调用,因为该用户为null
为了处理这种情况,您应该将ConnectionId与用户匹配,并将其保存在某个位置,在OnDisconnect中,您可以通过ConnectionId访问用户
public override async Task OnConnected()
{
var id = Context.ConnectionId;
var userName = Context.User.Identity.Name;
SaveUserToDb(id,userName);//
// other codes
}
public override async Task OnDisconnected(bool stopCalled)
{
var id = Context.ConnectionId;
var userName = GetUserNameFromDB(id);
// and now you have your username
}
你们能举个例子吗?嗨,我试过了,它之所以有效是因为它是本地的,但当使用web api时,它不起作用。如果它在本地工作,它也必须在服务器上工作,并没有区别,我想你们还有另一个问题。