我一直試圖通過關於CodeProject(http://www.codeproject.com/Articles/562023/Asp-Net-SignalR-Chat-Room)上的「Asp.Net SignalR聊天室」教程來實現聊天室。不過,我得到錯誤「Hubs.ChatHubs.OnDisconnected():發現重寫沒有合適的方法」「OnDisconnected():沒有找到合適的方法覆蓋」 - SignalR
ChatHub類:
public class ChatHub : Hub
{
#region Data Members
static List<UserDetail> ConnectedUsers = new List<UserDetail>();
static List<MessageDetail> CurrentMessage = new List<MessageDetail>();
#endregion
#region Methods
public void Connect(string userName)
{
var id = Context.ConnectionId;
if (ConnectedUsers.Count(x => x.ConnectionId == id) == 0)
{
ConnectedUsers.Add(new UserDetail { ConnectionId = id, UserName = userName });
// send to caller
Clients.Caller.onConnected(id, userName, ConnectedUsers, CurrentMessage);
// send to all except caller client
Clients.AllExcept(id).onNewUserConnected(id, userName);
}
}
public void SendMessageToAll(string userName, string message)
{
// store last 100 messages in cache
AddMessageinCache(userName, message);
// Broad cast message
Clients.All.messageReceived(userName, message);
}
public void SendPrivateMessage(string toUserId, string message)
{
string fromUserId = Context.ConnectionId;
var toUser = ConnectedUsers.FirstOrDefault(x => x.ConnectionId == toUserId);
var fromUser = ConnectedUsers.FirstOrDefault(x => x.ConnectionId == fromUserId);
if (toUser != null && fromUser != null)
{
// send to
Clients.Client(toUserId).sendPrivateMessage(fromUserId, fromUser.UserName, message);
// send to caller user
Clients.Caller.sendPrivateMessage(toUserId, fromUser.UserName, message);
}
}
public override System.Threading.Tasks.Task OnDisconnected()
{
var item = ConnectedUsers.FirstOrDefault(x => x.ConnectionId == Context.ConnectionId);
if (item != null)
{
ConnectedUsers.Remove(item);
var id = Context.ConnectionId;
Clients.All.onUserDisconnected(id, item.UserName);
}
return base.OnDisconnected();
}
#endregion
#region private Messages
private void AddMessageinCache(string userName, string message)
{
CurrentMessage.Add(new MessageDetail { UserName = userName, Message = message });
if (CurrentMessage.Count > 100)
CurrentMessage.RemoveAt(0);
}
#endregion
}
任何線索,爲什麼發生這種情況?
但使用公共覆蓋Task OnDisconnected(bool stopCalled)後。它無法調用客戶端方法是否有任何解決方案。例如:在上面的例子中,Palindrome使用'Clients.All.onUserDisconnected(id,item.UserName);'所以在使用bool後無法調用stopCalled – 2015-01-01 12:07:59
請看'halter73'的答案,以瞭解bool的用途在這裏:http://stackoverflow.com/questions/24878187/signalr-detecting-alive-connection-in-c-sharp-clients – 2015-07-03 03:08:07