如何将 SignalR 2 与 WEB API 一起使用,从 API 和客户端调用 SignalR 方法

How to use SignalR 2 with WEB API, calling SignalR methods from API and from Clients

过去两天我一直在努力研究如何让 SignalR 2 与 Web 一起工作 API。我尝试遵循一些来自 Microsoft 和其他人的关于该主题的教程,但我仍然花了一些时间来理解我错在哪里。我发布这个问题是为了帮助那些最终遇到与我相同情况的人。

我需要在 SignalR 上创建一个集线器,它可以作为客户端响应控制台应用程序 (C#) 和 Web 应用程序 (AngularJs),我还需要它在某种方法后发送信号API 被击中。

我遵循了这些(和其他)教程:

ASP.NET SignalR Hubs API Guide - Server (C#)

ASP.NET SignalR Hubs API Guide - .NET Client (C#)

Stream Web API Transactions Using SignalR

还有更多,但这些是我能找到的最好的。此外,这里和其他网站上还有许多其他问题。

我能想到的最好的解决方案是只响应 API 方法被命中,但客户端无法触发 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 上点击这些方法,以便他们在需要时可以获得一些个人回应?

好的,所以这里的主要问题是,当我开始的时候,我发现了如何让集线器响应 API 的方法(我当时找不到在哪里发布这个答案),然后我只找到了客户端调用集线器方法的不同方法,并且一个不能与另一个一起使用。我无法将两者设置为相同的方式。

这是我的 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}");
    }

这是我发现实现它的唯一方法。集线器不会用客户端使用的方法进行响应。那些必须有不同的代码,就像这里 Hub 的方法:

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

    }

我试图在客户端方法上实现我的“hubContext”解决方案,但它根本不起作用,当我尝试实现“Clients" 解决方案,后来发现,要被我的 API 消耗,我不得不把它变成 "non-static method",然后在控制器上调用它,这只会导致这个错误:"using hubcontext outside hub pipeline is unsoported"

然后,我在 Stack Overflow 上找到了 this blessed answer,它最终告诉我哪里错了。

这正是我做错的地方。我必须根据方法的 objective 以不同的方式实现。我的 API 使用“hubContext”,我的客户端应用程序使用“Clients” ".

我希望它能帮助其他正在为这个问题苦苦挣扎的人更快地找到它,因为有福的答案是关于 ASP.NET MVC,而不是 Web API。