Как использовать SignalR 2 с WEB API, вызывая методы SignalR из API и от клиентов - PullRequest
0 голосов
/ 18 февраля 2019

Последние два дня я боролся за то, чтобы заставить SignalR 2 работать с Web API.Я пытался следовать нескольким учебникам, от Microsoft и других, по этой теме, но все же мне потребовалось время, чтобы понять, где я был не прав.Я публикую этот вопрос, чтобы помочь кому-то, кто оказался в той же ситуации, в которой находился.

Мне нужно было создать концентратор на SignalR, который мог бы отвечать на консольное приложение (C #) и веб-приложение (AngularJs) как клиенты, и я также нуждался в том, чтобы он отправлял сигналы после того, как определенный метод на API был поражен.

Я следовал этим (и другим) учебникам:

ASP.NET SignalRРуководство по API-концентраторам - Сервер (C #)

Руководство по API-концентраторам ASP.NET SignalR - .NET Client (C #)

Stream Web API СделкиИспользование SignalR

И еще немного, но это лучшее, что я смог найти.Кроме того, дюжина других вопросов, здесь и на других сайтах.

Лучшее, что я мог придумать, было решение, которое отвечало только на метод API, который попал, но клиенты не могли запуститьметодов Hub (они могли только слушать его).

Это был код моего Hub:

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

    public static void GetStatus(string message)
    {
        hubContext.Clients.All.acknowledgeMessage($"GetStatus: {message}");
    }

    public void GetMessage(string message)
    {
        hubContext.Clients.User(id).acknowledgeMessage($"GetStatus: {message}");            
    }
}

И мой вопрос был: Как я могу заставить клиентов использовать эти методы на Hubчтобы они могли получить личный ответ, если это необходимо?

1 Ответ

0 голосов
/ 18 февраля 2019

Хорошо, поэтому основная проблема здесь заключалась в том, что где-то, когда я начинал, я узнал, как заставить Hub реагировать на методы API (я не мог найти, где к тому времени, когда я публикую этот ответ), а затем яКлиентам удалось найти только разные способы вызова методов Hub, и один из них не работал с другим.Я не могу установить оба значения одинаково.

Это код из контроллера моего API:

public IHttpActionResult TesteComunicacao(string mensagem)
    {
        MyHub.GetStatus("Message here!");

        return Ok("ok");
    }

И метод Hub:

// Use this for Server Methods
public static void GetStatus(string message)
    {
        hubContext.Clients.All.acknowledgeMessage($"GetStatus: {message}");
    }

Этоединственный способ, который я нашел, чтобы это произошло.Концентратор не будет отвечать методом, используемым клиентами.У них должен быть другой код, например, метод Хаба:

// Use this for Clients Methods
public void GetMessage(string message)
    {
        Clients.Caller.acknowledgeMessage($"GetMessage: {message}");

    }

Я пытался реализовать свое решение " hubContext " для метода клиентов, но он не работалвсе, и когда я попытался реализовать решение " Clients ", которое позже обнаружил использование моим API, мне пришлось сделать его "нестатическим методом", а затем вызвать его на контроллере, которая привела только к этой ошибке: «использование hubcontext вне конвейера концентратора не отсортировано»

И затем я нашел этот благословенный ответ здесь, на переполнении стека, который в конце концов показал мне, где я был неправ.

И это именно то, что я делал неправильно.Я должен реализовать тогда по-разному в зависимости от цели метода.Те, которые будут использованы моим API, используют " hubContext ", а те, которые будут использованы моим клиентским приложением, используют " Clients ".

Надеюсь, это поможетдругие люди борются с этой проблемой, чтобы найти ее быстрее, поскольку благословенный ответ был о ASP.NET MVC, а не о Web API.

...