【问题标题】:SignalR over three applicationsSignalR 超过三个应用程序
【发布时间】:2020-12-29 23:33:37
【问题描述】:

我们有三个 .Net Core 应用程序,一个 Blazor 服务器前端 (A) 调用一个 Web 应用程序 (B),它调用另一个 Web 应用程序 (C)。

用于通过 SignalR Core 进行通信的应用程序 A 和 C。我们不得不将应用程序 B 置于这些(商业原因)的中间。

我想知道我们是否仍然可以通过应用程序 B 进行这种通信?

我们可以使用 B 作为 SignalR 代理吗?如果可以,如何使用?

非常感谢。

【问题讨论】:

  • 您可以同时将 App B 作为 SignalR 客户端和服务器。应用 B 连接到应用 A,并订阅消息,并将它们中继到从应用 C 连接的客户端。
  • 嗨,Sherif,我一直在思考这些问题——你能演示如何在同一系统上的客户端和服务器之间中继消息吗? - 我对 SignalR 很陌生。
  • 连接到同一中心服务器的客户端应用程序可以相互通信。首先要开始使用 SignalR HubSignalR JavaScript client,然后将 SignalR 集成到您的应用中。
  • 我曾经为 signalR 1 制作了一个代理服务器,在那里我注入了一个自定义的IHubManager。我能够挂上GetHubMethod 并接听电话。如果我有时间,我可以尝试挖掘它并为 .net Core 重写它。
  • @Jason,这将非常有用。

标签: c# asp.net-core web-applications signalr


【解决方案1】:

首先,您需要一个Hosted Service,它在后台运行并持有一个到 AppA 的信号器客户端连接对象。

public class SignalRClientService : IHostedService
{
    private HubConnection _connection;
    private readonly IHubContext<MyHub> _myhubContext;

    public SignalRClientService(IHubContext<MyHub> myhubContext)
    {
        _myhubContext = myhubContext;
    }

    public async Task StartAsync(CancellationToken cancellationToken)
    {
        _connection = new HubConnectionBuilder()
            .WithUrl("https://example.com/hub")
            .WithAutomaticReconnect()
            .Build();
        await _connection.StartAsync();

        _connection.On<string, int>("myEvent", MyEventHandler);
    }

    // Route a message from C to A
    public Task Method1(string arg1, int arg2)
    {
        return _connection.SendAsync("Method1", arg1, arg2);
    }

    // Route a message from A to C
    private Task MyEventHandler(string arg1, int arg2)
    {
        return _myhubContext.Clients.All.SendAsync("myEvent", arg1, arg2);
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        return _connection.StopAsync();
    }
}

您的集线器可能看起来像

public class MyHub : Hub
{
    private readonly SignalRClientService _signalRClientService;

    public MyHub(SignalRClientService signalRClientService)
    {
        _signalRClientService = signalRClientService;
    }

    public Task Method1(string args1, int args2)
    {
        return _signalRClientService.Method1(args1, args2);
    }
}

这里有一个警告,因为 A 和 B 之间只保持一个连接,A 基本上只能看到一个用户。您可以转发身份验证令牌并在 A 和 B 之间维护多个连接,但解决方案会稍微复杂一些,但这是可能的。

【讨论】:

  • 嗨,谢里夫。感谢那。我明天试试,然后回复你。
  • 我玩过这个,但我没有得到任何结果。我稍微澄清一下我的问题。这只是单向通信(C -> B -> A)。你能提供更多关于如何连接它的信息吗? C 是一个 Api,它只将对象传递回链 (C B A)。
  • 终于整理好了。在我将 SignalRClientService 注册为托管服务和范围服务之前,应用 B(托管服务)不允许连接。诡异的。感谢@Sherif。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-24
  • 1970-01-01
相关资源
最近更新 更多