2013-10-03 1 views
4

Я новичок в сигнале и читаю API и играю с ним. немного запутался в хабе и его контексте.SignalR - HubContext и Hub.Context

То есть, Hub.Context не HubContext.

HubContext я могу получить от GlobalHost.ConnectionManager.GetHubContext<THub>()

и Hub.Context дает мне HubCallerContext который я не знаю, как использовать.

Каковы отношения? Как я могу получить HubContext from Hub или Hub from HubContext?

ответ

7

Результат плохого именования. Hub.Context - это контекст http от вызывающего (более похожий на контекст запроса). В HubContext есть GroupManager и клиенты, которые сопоставляются с Hub.Groups и Hub.Clients.

Вы можете добавлять к группам и разговаривать с клиентом со стороны хаба. Внутри концентратора вы можете получить идентификатор соединения вызывающего абонента и получить контекст http-запроса, связанный с вызовом концентратора. Вне хаба вы не можете делать Context.Clients.Caller или Context.Clients.Others, потому что нет вызывающего абонента, когда вы находитесь за пределами концентратора.

Надеюсь, что это прояснит ситуацию.

+0

Почему в SignalR отсутствует эквивалент HttpContext.Current? Я создал много кода, который использует это в WebForms и веб-API, но теперь, когда я добавляю SignalR в микс, похоже, что я должен изменить все свои внутренние API, чтобы принять Hub.Context. У меня есть это право? –

6

HubCallerContext - это контекст, относящийся к текущему запросу. Вы не могли бы сделать следующее, используя 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 
    } 
} 

Причина, почему вы не смогли бы сделать это с HubContext, потому что вы не имеете Clients.Caller, и вы не имеете Context.ConnectionId.

Однако вы можете делать все, что вы можете сделать, с помощью HubContext с HubCallerContext.

Подумайте о HubCallerContext как относительной, более продвинутой версии HubContext запроса.

В конечном счете HubContext используется, когда вы хотите отправить данные клиентам-концентраторам вне контекста запроса.

Надеюсь, это поможет!