2015-01-22 4 views
2

나는 형태로 입력 한 이메일 주소를 기반으로 새 그룹 생성 추가하는 비 정적 방법으로 SignalR 허브가 있습니다는에서 SignalR 허브 그룹을 추가하는 MVC 컨트롤러

public class EmailHub : Hub 
{ 
    public void AddEmail(string email) 
    { 
     base.Groups.Add(base.Context.ConnectionId, email); 
    } 
} 
이 에게 내가 싶습니다

을 내 MVC 컨트롤러에서이 허브 메서드를 호출하십시오. 내 방법은 현재 다음과 같습니다.

public class MyController : Controller 
{ 
    public ActionResult AddEmail(string email) 
    { 
     var hub = GlobalHost.ConnectionManager.GetHubContext<EmailHub>(); 
     hub.Clients.All.AddEmail(email); 

     return View(); 
    } 
} 

그러나 컨트롤러의 코드는 허브 메서드를 호출하지 않습니다. 허브 메소드를 성공적으로 호출 할 수 있도록 변경하려면 어떻게해야합니까?

답변

3

ConnectionId을 매개 변수로 전달해야하며, SignalR이 이미 연결될 때까지는이를 가져올 수 없습니다.

SignalR 연결은 클라이언트의 "페이지보기"에 대해서만 제공됩니다. 즉, /chat/rooms/1으로 이동하면 ConnectionId이 표시되고 /chat/rooms/2으로 이동하면 이 달라집니다.ConnectionId이 표시됩니다. 따라서 여기에서 사용하려고 할 때 은 본질적으로 존재하지 않습니다.

두 가지 옵션이 있습니다.

  1. 각 페이지마다 SignalR을 연결 한 후 업데이트를 구독하십시오. 이 시나리오에서는 일반적인 AddEmail 요청을 제출하고 View()로드 후 JavaScript에서 SignalR을로드하고 연결 한 다음 hub.server.addEmail(email)을 제출합니다. 이것은 SignalR의 표준 접근 방식입니다.

  2. 이것은 본질적으로 똑같지 만보기간에 SignalR 연결을 유지할 수있는 SPA 프레임 워크를 사용하는 경우 작동합니다. 물론, 그것은 꽤 중요한 변화입니다.

나는 액션 AddEmail 실제로 나는 그것이 ViewResult를 반환로부터 추론 페이지입니다 가정이 모든 것을 기반으로했습니다. 이것이 AJAX에서 호출 된 경우 ConnectionId을 쿼리 매개 변수로 추가하면이 모든 것이 문제가 될 수 있습니다.

관련 문제