我有一个由网关和几个后端服务组成的 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);
}
}
但是,这是一个大型企业应用程序,我不希望网关对后端服务的实际代码有任何依赖。但是该示例仅在网关和后端服务中都定义了同名集线器时才有效。
一方面,我试图避免在网关中放置此类专用代码,另一方面,我想利用使用实际函数名称和参数的能力。我不想要具有单一功能的“主集线器”。
有没有办法做到这一点?