SignalR + отправка сообщения в концентратор через метод действия

Я использую хаб-функцию SignalR ( https://github.com/SignalR/SignalR ) для публикации сообщений всем подписчикам:

public class NewsFeedHub : Hub public void Send(string channel, string content) { Clients[channel].addMessage(content); } 

Это отлично работает при вызове «Отправить» через Javascript, но мне также хотелось бы, чтобы веб-приложение публиковало сообщения (из метода действия ASP.NET MVC). Я уже пытался создать экземпляр нового объекта ob NewsFeedHub и вызвать метод отправки, но это приводит к ошибке (поскольку базовое «соединение» концентратора не установлено). Есть ли способ использовать концентратор без соединения?

Обратите внимание, что API SignalR несколько раз менялся, так как этот вопрос был задан. Существует вероятность того, что некоторые ответы станут устаревшими. Это не означает, что они должны быть проголосованы, поскольку они были правильными на момент написания

Для этого есть еще один обновленный ответ, как это видно в вики-сигнале

C #

 Public ActionResult MyControllerMethod() { var context = GlobalHost.ConnectionManager.GetHubContext(); context.Clients.All.methodInJavascript("hello world"); // or context.Clients.Group("groupname").methodInJavascript("hello world"); } 

vb.net

 Public Function MyControllerMethod() As ActionResult Dim context = GlobalHost.ConnectionManager.GetHubContext(Of MyHub)() context.Clients.All.methodInJavascript("hello world") '' or context.Clients.Group("groupname").methodInJavascript("hello world") End Function 

Обновить

Этот код обновлен. Следуйте http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-server для внесения изменений.

Если вы используете контейнер DI

Если вы используете контейнер DI, чтобы GetHubContext концентраторы, IConnectionManager из своего контейнера и вызовите GetHubContext в этом GetHubContext соединений.

2018 февраля, краткое и простое решение

Для этого я обычно проектирую свои хабы следующим образом:

 public class NewsFeedHub : Hub { private static IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext(); // Call this from JS: hub.client.send(channel, content) public void Send(string channel, string content) { Clients.Group(channel).addMessage(content); } // Call this from C#: NewsFeedHub.Static_Send(channel, content) public static void Static_Send(string channel, string content) { hubContext.Clients.Group(channel).addMessage(content); } } 

Таким образом, это легко вызвать из Javascript и из внешнего кода. Эти два метода приводят к тому же событию на клиенте.

обновлено : этот ответ тоже старый! По-видимому, публичный API SignalR находится в постоянном streamе. Тим Б Джеймс имеет новое, правильное использование API с июля 2012 года.

Принимаемый в настоящее время ответ от Майка стар, и больше не работает с последней версией SignalR.

Вот обновленная версия, которая показывает, как отправить сообщение в концентратор из действия controllerа MVC:

 public ActionResult MyControllerMethod() { // Important: .Resolve is an extension method inside SignalR.Infrastructure namespace. var connectionManager = AspNetHost.DependencyResolver.Resolve(); var clients = connectionManager.GetClients(); // Broadcast to all clients. clients.MethodOnTheJavascript("Good news!"); // Broadcast only to clients in a group. clients["someGroupName"].MethodOnTheJavascript("Hello, some group!"); // Broadcast only to a particular client. clients["someConnectionId"].MethodOnTheJavascript("Hello, particular client!"); } 

После ответа от DDan вы можете создать перегруженный статический метод и сохранить общую логику одним способом – я использую этот шаблон

 public class ChatHub : Hub { private static IHubConnectionContext GetClients(ChatHub chatHub) { if (chatHub == null) return GlobalHost.ConnectionManager.GetHubContext().Clients; else return chatHub.Clients; } // Call from JavaScript public void Send(string message) { Send(message, this); } // Call from C# eg: Hubs.ChatHub.Send(message, null); public static void Send(string message, ChatHub chatHub) { IHubConnectionContext clients = GetClients(chatHub); // common logic goes here clients.All.receiveSend(message); } } 

Затем с вашего controllerа вы можете использовать

 Hubs.ChatHub.Send(arg1, null); 
Interesting Posts
Давайте будем гением компьютера.