2017-08-13 55 views
0

我有一个由网关和几个后端服务组成的Web应用程序。 网关是一个自托管的OWIN应用程序,涵盖诸如身份验证,授权以及将API调用路由到后端的问题。SignalR简单网关

我有兴趣在我的后端服务之一中使用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

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

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