Signalr 信号机简单网关

Signalr 信号机简单网关,signalr,signalr-hub,signalr-backplane,Signalr,Signalr Hub,Signalr Backplane,我有一个由网关和几个后端服务组成的web应用程序。 网关是一个自托管的OWIN应用程序,它涉及身份验证、授权和将api调用路由到后端等问题 我对在我的一个后端服务中使用SignalR将数据推送到客户端很感兴趣。例如,用户启动一个长时间运行的查询,当数据可用时,将数据反馈给客户端 我设法将扩展文章中的背板用作消息传递机制(尽管它似乎不是为这种消息传递而设计的) “网关”集线器代码:(该逻辑仅用于测试目的) 后端控制器代码 [HttpPost] [Route("signin")]

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

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

我设法将扩展文章中的背板用作消息传递机制(尽管它似乎不是为这种消息传递而设计的)

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

后端控制器代码

    [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);
        }
    }
[HttpPost]
[路线(“签名”)]
public void PostSignin([FromBody]字符串id)
{
启动(id);
}
公共异步任务启动(字符串id)
{
var context=GlobalHost.ConnectionManager.GetHubContext();
int i=0;
while(true)
{
i++;
context.Clients.Client(id).showMessage(“num”+i);
等待任务。延迟(1000);
}
}
但是,这是一个大型企业应用程序,我不希望网关依赖于后端服务的实际代码。但是,只有在网关和后端服务中都定义了具有相同名称的集线器时,该示例才有效

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


有没有办法做到这一点?

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


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

最终并没有做到这一点,但后来发现的解决方案确实是使用“主集线器”,但实际上根本不需要任何函数

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

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