2013-10-03 2 views
4

나는 signalR을 처음 접하고 API를 읽고 그것에 대해 놀고있다. Hub와 Context에 대해 약간 혼란 스럽습니다.SignalR-HubContext and Hub.Context

즉, Hub.ContextHubContext이 아닙니다.

HubContextGlobalHost.ConnectionManager.GetHubContext<THub>()

Hub.Context 나에게 내가 사용하는 방법을 잘 오전 HubCallerContext을 제공에서 내가 얻을 수 있습니다.

그들의 관계는 무엇입니까? HubContext from Hub 또는 Hub from HubContext을 얻으려면 어떻게해야합니까?

답변

7

잘못된 이름 지정의 결과. Hub.Context는 호출자의 HTTP 컨텍스트 (요청 컨텍스트와 비슷 함)입니다. HubContext에는 Hub.Groups 및 Hub.Clients에 매핑되는 GroupManager 및 Clients가 있습니다.

그룹에 추가하여 허브 외부에서 클라이언트와 대화 할 수 있습니다. 허브 내부에서 호출자의 연결 ID를 가져 와서 허브 호출과 관련된 http 요청 컨텍스트를 가져올 수 있습니다. 허브 외부에서는 Context.Clients.Caller 또는 Context.Clients.Others를 수행 할 수 없습니다. 허브 외부에있을 때 호출자가 없기 때문입니다.

희망 사항이 해결됩니다.

+0

왜 SignalR에 HttpContext.Current가 없습니까? WebForms과 Web API에서 이것을 활용하는 많은 코드를 만들었지 만 이제 SignalR을 믹스에 추가 했으므로 내 내부 API를 모두 변경하여 Hub.Context를 받아야하는 것처럼 보입니다. 나는 그 권리가 있니? –

6

HubCallerContext는 현재 요청과 관련된 컨텍스트입니다. 당신은 A HubContext를 사용하여 다음을 수행 할 수 없을 것입니다 :

public class MyHub : Hub 
{   
    public void Foo() 
    {    
     // These two are equivalent 
     Clients.Caller.bar(); 
     Clients.Client(Context.ConnectionId).bar(); // Context.ConnectionId is the client that made the request connection id 
    } 
} 

당신이 Clients.Caller이없는 당신은이 없기 때문에 당신이 HubContext 이러한 작업을 수행 할 수 없을 것입니다 이유는 Context.ConnectionId.

그러나 HubCallerContext를 사용하여 HubContext를 사용하여 수행 할 수있는 모든 작업을 수행 할 수 있습니다.

HubCallerContext를 요청 상대적인 고급 버전의 HubContext로 생각하십시오.

궁극적으로 HubContext는 요청 컨텍스트 외부의 허브 클라이언트에 데이터를 보내려는 경우에 사용됩니다.

희망이 도움이됩니다.