2010-05-24 3 views
9

인사말, 다음 시나리오에 구현하는 데 도움이되는 조언이나 링크를 누군가가 나에게 줄 수 있습니까? 페이지는 asp.net mvc로 작성됩니다. 승인은 회원에 의해 이행 될 것입니다. 다음과 같은 시나리오는 다음과 같습니다.asp.net mvc 누가 온라인입니까

사용자 1 단지에 로그온 한 잠시 후, 사용자 2는 성공으로 로그인을 시도합니다. 그런 다음 user2가 방금 로그인 한 사용자 1에게 알림을 보내야합니다. 또한 User2 에 User1이 온라인임을 알리는 메시지가 표시됩니다.

어떻게하면 좋을까요? 또한 이러한 사용자가 서로에게 메시지를 쓸 수 있어야합니다. (채팅처럼).

답변

6

있습니다 방법을 asp.net 멤버쉽 공급자, 특히 IsUserOnline() 및 CountUsersOnline()과 같은 것에서이 작업을 수행 할 수 있습니다. 이 방법의 유일한 문제점은 실제로는 절름발이라는 것입니다. 멤버쉽 공급자의 LastActivityDate()와 web.config에서 설정할 수있는 창에 따라 다릅니다. 멤버 자격 공급자 플러스의 Web.config의 시간 윈도우와의 마지막 만남이 만료되지 않은 경우 즉, 사용자는 온라인으로 간주됩니다.

우리는이 scenairo를 가져다가 혜성 서버를 설정하고 웹 서버를 10 분마다 핑에 의해 우리를 위해 일했다. 웹 서버가 핑 (ping)되면 구성원 공급자의 LastActivityDate를 업데이트합니다.

우리 12 분으로 활동 창뿐만 아니라 세션 타이머를 설정합니다. 이를 통해 우리는 누가 약 10 분의 정확도로 온라인 상태인지 파악할 수 있습니다.


다음은 Web의 라인입니다.설정 :

function getData() { 
    $.getJSON("/Account/Timer", gotData); 
    } 

    // Whenever a query stops, start a new one.  
    $(document).ajaxStop(getData, 600000); 

    // Start the first query. 
    getData(); 

는 여기에 우리의 서버 코드입니다 : 여기

<membership userIsOnlineTimeWindow="12"> 

jQuery를 혜성 서버입니다

public JsonResult Timer() 
    { 
      MembershipUser user = Membership.GetUser(User.Name); 
      user.LastActivityDate = DateTime.Now; 

      Membership.UpdateUser(user); 

      // You can return anything to reset the timer. 
      return Json(new { Timer = "reset" }, JsonRequestBehavior.AllowGet); 
    } 
+0

이 서버 코드는 어디에 추가합니까? – DoIt

3

jQuery 폴링이 필요합니다.

당신은 쉽게 다음 온라인 사용자를 확인하고 호출 jQuery를 함수로 다시 PartialView을 반환 것 인 ActionResult에 jQuery를 게시 할 수 있습니다.

는 반환 PartialView 모든 사용자가있는 다음 패널 애니메이션 일종의 팝업 될 수있다 기록 할 수도 있습니다.

javascript를 사용하여 시간 측정 폴링을 컨트롤러로 다시 실행하십시오.

+0

네, 유사한 솔루션하지만 방법에 대해 생각했다 누가 온라인 상태인지 확인해야합니까? 기능을 만드는 방법 (서버 측에서보기) –

+0

사용자가 로그인 할 때 db 항목을 작성해야하고 해당 사용자의 세션 끝 부분에서 해당 항목을 삭제해야합니다. 로그인 한 모든 사용자를 캐시에 보관하고 세션 종료시이를 제거 할 수 있습니다. 어느 쪽이든 당신은 어딘가에서 그들을 로그하고 세션 끝 또는 무언가를 활용할 필요가 있다고 생각합니다. – griegs

+0

ok, 그리고 어떤 suggesstions 어떻게해야합니까 : "당신은 모든 로그인 된 사용자를 캐시에 유지하고 세션 끝에서 제거 할 수 있습니다. "에서 asp.net mvc? –

2

당신은 onlines에게 웹에서 라이브를 얻을 수 없습니다. 페이지를 새로 고치거나 ajax로 컨텐츠를 새로 고쳐야합니다. 그래서 나는 그것을 해결할 것이라고 생각합니다.

ps. 채팅 및 온라인 문제에는 두 가지 옵션이 있습니다. 당신은 데이터베이스에 저장할 수 있습니다 - 는 내가 제안 - 또는 저장 메모리에, 당신은 this

테이블보고 할 수 있습니다 :

Users 
-Id/int - identity 
-LoginTime/datetime 
-IsOnline/bit 

Friends 
-Id/int - identity 
-FirstUserId/int 
-SecondUserId/int 

public class UserInformation 
{ 
    public IList<User> OnlineFriends { get; set;} 
    public IList<User> JustLoggedFriends { get; set; } /* For notifications */ 
} 

public class UserRepository 
{ 
    public UserInformation GetInformation(int id, DateTime lastCheck) 
    { 
     return Session.Linq<User>() 
       .Where(u => u.Id == id) 
       .Select(u => new { 
           User = u, 
           Friends = u.Friends.Where(f => f.FirstUser.Id == u.Id || f.SecondUser.Id == u.Id) 
       }) 
       .Select(a => new UserInformation { 
           JustLoggedFriends = u.Friends.Where(f => f.IsOnline && f.OnlineTime >= lastCheck).ToList(), 
           OnlineFriends = u.Friends.Where(f => f.IsOnline).ToList() 
       }) 
       .ToList(); 
    } 
} 

public class UserService 
{ 
    public UserInformation GetInformation(int id, DateTime lastCheck) 
    { 
     return repository.GetInformation(id, lastCheck); 
    } 
} 

UI :

public class UserController 
{ 
    public ActionResult Index() 
    { 
     var userId = (int)Session["UserId"]; 
     var lastCheck = (DateTime)Session["LastCheck"]; 
     UserInformation info = userService.GetInformation(userId, lastCheck); 
     Session["LastCheck"] = DateTime.Now; 

     //show up notifications and online users. 
    } 
    public ActionResult Login() 
    { 
     User user = null; // TODO: get user by username and password 
     Session["UserId"] = user.Id; 
     Session["LastCheck"] = DateTime.Now; 
    } 
} 
+0

및이를 구현하여 GetUserOnlineFriends를 사용하여 주기적으로 확인할 수 있도록 - 2 분마다 - 사용자의 친구라고 말하니? 또한이 두 친구 간의 채팅 가능성을 구현하는 방법? –

+0

은 제한되지 않습니다. session_start 및 session_end 이벤트를 확인한 다음 사용자 온라인 업데이트 - 온라인 - 열 - session_start의 해고가 끝날 때 업데이트 된 사용자가 오프라인으로 기록 할 수 있습니다. - 열 _ 데이터 유형의 bit_이 문제를 해결할 것입니다. 그리고 나서 사용자가 온라인으로 그들을 보여 주면. 하지만이 알고리즘은 당신을 위해서가 아닙니다, 세션은 그것을 해결할 것입니다. 나는 그것을 지금 이해했다. 지금 편집. – cem