4,5 года после ответа на этот вопрос, и у нас есть библиотека, которая может значительно облегчить эту задачу: SignalR. Нет необходимости использовать общее состояние (что плохо, поскольку может привести к непредвиденным результатам), просто используйте класс HubContext для подключения к концентратору, который отправляет сообщения клиенту.
Во-первых, мы устанавливаем соединение SignalR, как обычно (см., Например, здесь ), за исключением того, что нам не нужен какой-либо метод на стороне сервера в нашем концентраторе. Затем мы делаем AJAX-вызов к нашей конечной точке / контроллеру и т. Д. И передаем идентификатор соединения, который мы получаем, как обычно: var connectionId = $.connection.hub.id;
. На стороне сервера вы можете запустить ваш процесс в другом потоке и вернуть 200 OK клиенту. Процесс будет знать идентификатор соединения, чтобы он мог отправлять сообщения обратно клиенту, например:
GlobalHost.ConnectionManager.GetHubContext<LogHub>()
.Clients.Client(connectionId)
.log(message);
Здесь log
- это метод на стороне клиента, который вы хотите вызвать с сервера, поэтому он должен быть определен так же, как вы обычно делаете с SignalR:
$.connection.logHub.client.log = function(message){...};
Подробнее в моем блоге здесь