SignalR 简单网关

SignalR simple gateway

我有一个由网关和多个后端服务组成的 Web 应用程序。 网关是一个自托管的 OWIN 应用程序,涵盖身份验证、授权和 api 对后端调用的路由等问题。

我有兴趣在我的一项后端服务中使用 SignalR 将数据推送到客户端。例如。用户开始一个长 运行 查询,数据可用时反馈给客户端。

我设法使用横向扩展文章中的背板作为消息传递机制(尽管它似乎不是为此类消息传递而设计的) SignalR scaleout explanation

"Gateway" Hub代码:(逻辑仅供测试)

    public override async Task OnConnected()
    {
        HttpClient client = new HttpClient()
        {
            BaseAddress = new Uri("http://localhost:8888/other/")
        };

        var result = await client.PostAsJsonAsync("signin", Context.ConnectionId);

        await base.OnConnected();
    }

后端控制器代码

    [HttpPost]
    [Route("signin")]
    public void PostSignin([FromBody]string id)
    {
        StartPing(id);
    }

    public async Task StartPing(string id)
    {
        var context = GlobalHost.ConnectionManager.GetHubContext<FrontendHub>();

        int i = 0;
        while (true)
        {
            i++;
            context.Clients.Client(id).showMessage("num " + i);
            await Task.Delay(1000);
        }
    }

但是,这是一个大型企业应用程序,我不希望网关对后端服务的实际代码有任何依赖。但该示例仅在网关和后端服务中定义了同名集线器时才有效。

一方面,我试图避免在网关中放置此类专用代码,另一方面,我想利用使用实际函数名称和参数的能力。我不想要一个功能单一的 "master hub"。

有办法吗?

最后没有全部搞定,后来发现解决方法确实是用了一个"Master hub",但其实根本不需要有什么功能

合同在后端服务和客户端应用程序之间。由于 SignalR 中的所有内容都是松散类型的,因此客户端在集线器上定义一些函数并且后端服务在集线器上调用相同的函数就足够了。集线器在其自己的代码中实际上不需要此功能。