我有一个由网关和几个后端服务组成的Web应用程序。 该网关是一个自托管的OWIN应用程序,涵盖了身份验证,授权和api调用到后端的路由等问题。
我有兴趣在我的一个后端服务中使用SignalR将数据推送到客户端。例如。用户启动长时间运行的查询,数据在可用时反馈给客户端。
我设法使用横向扩展文章中的背板作为消息传递机制(虽然它似乎不是为此类消息传递而设计的) SignalR scaleout explanation
“网关”中心代码:(该逻辑仅用于测试目的)
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);
}
}
但是,这是一个很大的企业应用程序,我不希望网关对后端服务的实际代码有任何依赖性。但该示例仅在网关和后端服务中定义了具有相同名称的集线器时才有效。
一方面,我试图避免在网关中放置这样的专用代码,另一方面,我想利用实际功能名称和参数的能力。我不想要一个具有单一功能的“主集线器”。
有办法吗?
答案 0 :(得分:0)
最终没有做到这一切,但后来发现的解决方案确实使用了“主集线器”,但它实际上根本不需要任何功能。
合同介于后端服务和客户端应用程序之间。由于SignalR中的所有内容都是松散类型的,因此客户端在集线器上定义了一些功能就足够了,后端服务在集线器上调用相同的功能。集线器实际上并不需要在自己的代码中使用此功能。