2014-11-04 4 views
0

고객이 지원 팀과 채팅 할 수있는 채팅을 구축 중입니다.SignalR - 허브가 온라인 인 경우 메시지 표시

모든 클라이언트 웹 사이트에서 채팅하고 있습니다. 그리고 지원 팀은 하나의 사이트를 가지고 있습니다. 지원팀이 사이트에 로그인하는 시점. 허브 연결이 사용 가능하며 대화가 열려 있습니다.

alert('cht is now online'); 

내 시도 :

ChatHub.cs

public void AdminJoin() 
    { 
     var adminUser = "Chat is now open" 

     Clients.All.AdminIsOnline(adminUser); 
    } 

코드 같은 것을 : 나는 supportTeam 허브를 시작하는 메시지를 표시 할 수있는 방법

그러나 클라이언트의 웹 사이트에

, 클라이언트 웹 사이트 :

chat.on('AdminIsOnline', function (adminUser) { 
      adminHasJoined(adminUser); 
     }); 

     function adminHasJoined(adminUser) { 
      alert(adminUser); 
     }; 

위의 코드는 클라이언트 웹 사이트 페이지를 새로 고칠 때 및 SuppertTeam-site가 온라인 일 때만 실행됩니다. suppoertTeam이 로그인 할 때마다 알림을 표시하고 싶습니다. 페이지 새로 고침에만 적용되지 않습니다.

답변

0

짧게 : 1. OnConnect 메소드를 상속하십시오. 2. 그룹에 사용자를 추가하십시오. 3. 그룹의 모든 구성원에게 새 그룹 구성원을 알리는 방법을 만듭니다. 4. JS를 사용하여 클라이언트 측에서 이벤트를 알립니다. 허브 예 : 답변

public class ChatHub : Hub 
    { 

     PREPP2Entities db = new PREPP2Entities(); 
     //Send message to chat room 
     public void SendChatMessage(string gn, string name, string message) 
     { 
      Clients.Group(gn).addChatMessage(name, message); 
      UserStatus(); 
     } 
     //Public method that available on client side and used to update user status on user actions (e.g.Connect, disconnect 
     public void UserStatus() 
     { 
      Clients.All.updateStatus(); 
     } 
     public override Task OnConnected() 
     { 
      //get user data 
      var x = (from a in db.Users where a.Login.Contains(Context.User.Identity.Name) select a.Role).FirstOrDefault(); 
      //Add to the list of online users 
      if (AlreadyOnline(Context.ConnectionId) == false) 
      { 
       try 
       { 
        UsersOnline uo = new UsersOnline(); 
        uo.ConnectionID = Context.ConnectionId; 
        uo.UserName = Context.User.Identity.Name; 
        uo.UserRole = x; 
        uo.Created = DateTime.Now; 
        db.UsersOnline.Add(uo); 
        db.SaveChanges(); 
       } 
       catch (DbEntityValidationException ex) 
       { 
        var errorMessages = ex.EntityValidationErrors 
          .SelectMany(y => y.ValidationErrors) 
          .Select(y => y.ErrorMessage); 
        var fullErrorMessage = string.Join("; ", errorMessages); 
        var exceptionMessage = string.Concat(ex.Message, " The validation errors are: ", fullErrorMessage); 
        throw new DbEntityValidationException(exceptionMessage, ex.EntityValidationErrors); 
       } 
       //User with role "User" 
       if (x == 1) 
       { 
        //Add user to group 
        JoinGroup(Context.ConnectionId, Context.User.Identity.Name, true); 
        var operatorName = GetOperator(); 
        //Find connection id 
        var cid = (from a in db.UsersOnline where a.UserName.Contains(operatorName) & a.UserRole == 2 select a.ConnectionID).FirstOrDefault(); 
        if (cid != null & !String.IsNullOrEmpty(cid)) 
        { 
         //Add user to group 
         JoinGroup(cid, Context.User.Identity.Name, false); 
        } 
        else 
        { 
         //Message that nobody's here 
         StringBuilder sb = new StringBuilder(200); 
         sb.AppendFormat("Здравствуйте {0}! ", Context.User.Identity.Name); 
         sb.Append("К сожалению сейчас наших стилистов нет в сети.<br />"); 
         sb.Append("Вы можете оставить сообщение, которое будет прочитано позже."); 
         string message = sb.ToString(); 
         SendChatMessage(Context.User.Identity.Name, "PREPP", message); 
        } 
       } 
       //Else user role belong to support team 
       else 
       { 
        //Find users that has this support team to talk 
        var oid = (from a in db.Users where a.Login.Contains(Context.User.Identity.Name) select a.Id).FirstOrDefault(); 
        var u = (from a in db.UsersOnline 
          join b in db.Users on a.UserName equals b.Login 
          where a.UserRole == 1 & b.OperatorID == oid 
          select a.UserName).ToArray(); 
        foreach (string n in u) 
        { 
         JoinGroup(Context.ConnectionId, n, false); 
        } 
       } 
      } 
      UserStatus(); 
      return base.OnConnected(); 
     } 
     public void JoinGroup(string connectionid, string groupName, bool send) 
     { 
      try 
      { 
       GroupInfo gi = new GroupInfo(); 
       gi.UserConnection = connectionid; 
       gi.GroupName = groupName; 
       gi.Created = DateTime.Now; 
       db.GroupInfo.Add(gi); 
       db.SaveChanges(); 
       Groups.Add(connectionid, groupName); 
      } 
      catch (DbEntityValidationException ex) 
      { 
       var errorMessages = ex.EntityValidationErrors 
         .SelectMany(x => x.ValidationErrors) 
         .Select(x => x.ErrorMessage); 
       var fullErrorMessage = string.Join("; ", errorMessages); 
       var exceptionMessage = string.Concat(ex.Message, " The validation errors are: ", fullErrorMessage); 
       throw new DbEntityValidationException(exceptionMessage, ex.EntityValidationErrors); 
      } 
      if (send == true) 
      { 
       var on = GetOperator(); 
       StringBuilder sb = new StringBuilder(200); 
       sb.AppendFormat("Здравствуйте {0}! ", Context.User.Identity.Name); 
       sb.AppendFormat("Я Ваш личный стилист - {0}. ", on); 
       sb.Append("Чем сегодня я могу помочь Вам?"); 
       string message = sb.ToString(); 
       SendChatMessage(groupName, on, message); 
      } 
      UserStatus(); 
     } 
     public bool AlreadyOnline(string connectionid) 
     { 
      bool exist; 
      var x = db.UsersOnline.Where(p => p.ConnectionID.Contains(connectionid)).Count(); 
      if (x > 0) 
      { 
       exist = true; 
      } 
      else 
      { 
       exist = false; 
      } 
      return exist; 
     } 
     public override Task OnDisconnected() 
     { 
      StringBuilder sb = new StringBuilder(100); 
      sb.AppendFormat("Пользователь {0} не в сети!", Context.User.Identity.Name); 
      string message = sb.ToString(); 
      SendChatMessage(Context.User.Identity.Name, "PREPP", message); 
      UserStatus(); 
      db.GroupInfo.RemoveRange(db.GroupInfo.Where(x => x.UserConnection.Contains(Context.ConnectionId))); 
      db.UsersOnline.RemoveRange(db.UsersOnline.Where(x => x.UserName.Contains(Context.User.Identity.Name))); 
      db.SaveChangesAsync(); 
      UserStatus(); 
      return base.OnDisconnected(); 
     } 
     public override Task OnReconnected() 
     { 
      StringBuilder sb = new StringBuilder(100); 
      sb.AppendFormat("Пользователь {0} вернулся к нам!", Context.User.Identity.Name); 
      string message = sb.ToString(); 
      SendChatMessage(Context.User.Identity.Name, "PREPP", message); 
      UserStatus(); 
      return base.OnReconnected(); 
     } 
     public string GetOperator() 
     { 
      //Возвращаем имя оператора если он был назначен ранее 
      var oid = (from a in db.Users where a.Login.Contains(Context.User.Identity.Name) select a.OperatorID).FirstOrDefault(); 
      if (oid.HasValue) 
      { 
       return db.Users.Where(x => x.Id == oid).Select(x => x.Login).SingleOrDefault(); 
      } 
      //Выбираем и добавляем пользователю случайного оператора 
      else 
      { 
       //выбираем всех пользователей с ролью оператора 
       var opname = (from a in db.UsersOnline where a.UserRole == 2 orderby (Guid.NewGuid()) select a.UserName).FirstOrDefault(); 
       //Назначем пользователю оператора 
       var opid = (from a in db.Users where a.Login.Contains(opname) select a.Id).SingleOrDefault(); 
       if (opid > 0) 
       { 
        WriteOperator(Context.User.Identity.Name, opid); 
        return opname; 
       } 
       else 
       { 
        var op = (from a in db.Users where a.Role == 2 orderby (Guid.NewGuid()) select a.Id).FirstOrDefault(); 
        WriteOperator(Context.User.Identity.Name, op); 
        return db.Users.Where(x => x.Id == op).Select(x => x.Login).SingleOrDefault(); 
       } 
      } 
     } 
     void WriteOperator(string username, int operatorid) 
     { 
      var uid = db.Users.Where(p => p.Login == username).Select(x => x.Id).FirstOrDefault(); 
      var a = db.Users.Find(uid); 
      if (a != null) 
      { 
       a.OperatorID = operatorid; 
       db.SaveChanges(); 
      } 
      else throw new Exception(); 

} }

+0

감사합니다. 나는 더 간단한 것을 찾고 있었다. 연결을 찾을 수없는 경우 자동으로 허브에 다시 연결하려고 클라이언트를 추가 할 수 있습니까? 그 자바 스크립트는 어떻게 생겼지? – user3228992

+0

기본적으로 SignalR 클라이언트는 서버와의 연결이 해제되는 즉시 재 연결을 시도합니다. 여기서 무엇을 이루려고합니까? – Chris

+0

@Chris 문제는 허브에 연결하기 위해 클라이언트 웹 사이트를 새로 고쳐야한다는 것입니다. 이것은 시나리오입니다 : 클라이언트 웹 사이트로 이동하고 허브가 오프라인 인 경우, 물론 연결되지 않습니다. 클라이언트 웹 사이트에있는 동안 adn을 시작한 후 supportSite (허브 시작)를 시작하십시오. 그런 다음 허브가 온라인 인 클라이언트 웹 사이트에 msg를 표시하려고합니다. 페이지를 새로 고칠 필요없이! – user3228992

관련 문제