Использование SignalR для push-уведомления пользователя при входе пользователя на сайт [дубликат]

2017 ответ: теперь вы можете делать то, что хотите, в каждом текущем браузере и узле

. Это довольно просто:

  • Вернуть обещание
  • Используйте 'await' , в котором JavaScript ожидает, что обещание будет разрешено в vlue (например, hTTP-ответ)
  • Добавьте 'async' для родительской функции

Вот рабочая версия вашего кода:

(async function(){

var response = await superagent.get('...')
console.log(response)

})()

ожидание поддерживается во всех текущих браузерах и узлах 8 [/ д2]

55
задан Ashley Medway 5 January 2015 в 12:42
поделиться

3 ответа

2018 February, Краткое и простое решение

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

public class NewsFeedHub : Hub 
{
    private static IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<NewsFeedHub>();

    // 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 и обратно -end код. Эти два метода приводят к тому же событию на клиенте.

42
ответ дан DDan 27 August 2018 в 12:44
поделиться

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

public class ChatHub : Hub
{
    private static IHubConnectionContext<dynamic> GetClients(ChatHub chatHub)
    {
        if (chatHub == null)
            return GlobalHost.ConnectionManager.GetHubContext<ChatHub>().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<dynamic> clients = GetClients(chatHub);
        // common logic goes here 
        clients.All.receiveSend(message);
    }
}

. Затем с вашего контроллера вы можете использовать

Hubs.ChatHub.Send(arg1, null);
1
ответ дан J45 27 August 2018 в 12:44
поделиться

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

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

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

public ActionResult MyControllerMethod() 
{
     // Important: .Resolve is an extension method inside SignalR.Infrastructure namespace.
     var connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>();
     var clients = connectionManager.GetClients<MyHub>();

     // 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!");
 } 
8
ответ дан Tim B James 27 August 2018 в 12:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: