1

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

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

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

“网关”集线器代码:(逻辑仅用于测试目的)

    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);
        }
    }

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

一方面,我试图避免在网关中放置此类专用代码,另一方面,我想利用使用实际函数名称和参数的能力。我不想要具有单一功能的“主集线器”。

有没有办法做到这一点?

4

1 回答 1

0

最终并没有全部做完,但后来发现的解决方案确实是使用“主集线器”,但它实际上根本不需要任何功能。

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

于 2017-10-01T15:02:15.297 回答