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时,它不起作用。如果它在本地工作,它也必须在服务器上工作,并没有区别,我想你们还有另一个问题。