Я создал чат с сигнализатором в mvc.
Я добавляю скрипты в виде чата.
<script>
$(function () {
// Declare a proxy to reference the hub.
var chatHub = $.connection.chatHub;
$.connection.hub.logging = true;
chatHub.client.SendMessage = function (message) {
$("#chatbox").append(
' <div class="dc-msg slideInright right"><img class="dc-img" src="../../Images/profile.png"><div class="dc-text">' +
message +
' </div></div>');
};
$.connection.hub.start().done(function () {
console.log('Now connected, connection ID=' + $.connection.hub.id);
})
.fail(function () { console.log('Could not connect'); });
});
</script>
и в классе хаба
public class ChatHub : Hub
{
private static readonly ConcurrentDictionary<string, UserHubModel> Users =
new ConcurrentDictionary<string, UserHubModel>();
static DoctorbamaContext _db = new DoctorbamaContext();
public static void SendMessage(int userId, string message)
{
var hubContext = GlobalHost.ConnectionManager.GetHubContext<ChatHub>();
var conList = new List<string>();
var user = _db.UserProfiles.Find(userId);
var hasList = Users.SingleOrDefault(m => m.Key == user.UserName);
if (hasList.Value != null)
foreach (var has in hasList.Value.ConnectionIds)
{
conList.Add(has);
}
hubContext.Clients.Clients(conList).SendMessage(message);
}
public override Task OnConnected()
{
var userName = Context.User.Identity.Name;
string connectionId = Context.ConnectionId;
var user = Users.GetOrAdd(userName, _ => new UserHubModel
{
UserId = userName,
ConnectionIds = new HashSet<string>()
});
lock (user.ConnectionIds)
{
user.ConnectionIds.Add(connectionId);
if (user.ConnectionIds.Count == 1)
{
Clients.Others.userConnected(userName);
}
}
return base.OnConnected();
}
public override Task OnDisconnected(bool stopCalled)
{
var userName = Context.User.Identity.Name;
string connectionId = Context.ConnectionId;
UserHubModel user;
Users.TryGetValue(userName, out user);
if (user != null)
{
lock (user.ConnectionIds)
{
user.ConnectionIds.RemoveWhere(cid => cid.Equals(connectionId));
if (!user.ConnectionIds.Any())
{
UserHubModel removedUser;
Users.TryRemove(userName, out removedUser);
Clients.Others.userDisconnected(userName);
}
}
}
return base.OnDisconnected(stopCalled);
}
}
это нормально во всех браузерах в p c и android телефоне,
, но не работают в iphone браузере.