【问题标题】:using signalR .net core client使用 signalR .net 核心客户端
【发布时间】:2018-02-28 20:32:32
【问题描述】:

我已经建立了一个signalR网站.net core。我在中心的功能是:

public async Task Notify(int id) {
    await Clients.All.InvokeAsync("Notified", id);
}

我也用下面的js测试过这个:

let connection = new signalR.HubConnection(myURL);

    connection.on('Notified', data => {
        console.log(4, data);
    });

    connection.start();

js 代码似乎工作正常,我在尝试connection.Invoke('Notify') 时看到了日志。

现在我有一个控制台应用程序需要进行调用。我正在尝试两种方式,不介意任何一种解决方案: 1. signalR 网站中的 mvc 控制器,可以获取 id 并调用“通知”。 2. 在控制台应用程序中使用客户端库Microsoft.AspNetCore.SignalR.Client

1的方式我只在经典的asp.net中做过这样的:

GlobalHost.ConnectionManager.GetHubContext(hubName)

但在 .net 核心中找不到执行此操作的方法。

方式2到目前为止我已经使用过该库并尝试过:

var con = new HubConnectionBuilder();
con.WithUrl(myURL);      
var connection = con.Build();
connection.InvokeAsync("Notify",args[0]).Wait();

这是我以与 js 代码相同的方式创建连接的最接近的方法。但是,此代码在调用 connection.InvokeAsync 时会抛出一个空指针。 connection 对象不为空。它似乎是一个为空的内部对象。根据堆栈跟踪,当内部调用 MoveNext() 函数时会引发异常。

【问题讨论】:

    标签: asp.net-core-mvc signalr.client asp.net-core-2.0 asp.net-core-signalr


    【解决方案1】:

    看起来两者目前都不可能。到目前为止,我只是使用了一种强制方式,希望是暂时的。

    我创建并使用了以下集线器基类:

    public abstract class MyHub : Hub
    {
    
        private static Dictionary<string, IHubClients> _clients = new Dictionary<string, IHubClients>();
    
        public override Task OnConnectedAsync()
        {
            var c = base.OnConnectedAsync();
            _clients.Remove(Name);
            _clients.Add(Name, Clients);
            return c;
        }
    
        public static IHubClients GetClients(string Name) {
            return _clients.GetValueOrDefault(Name);
        }
    }
    

    【讨论】:

    • 根据我的回复,您注入 IHubContext 是 GlobalHost 的替代品 - 这是一些代码:github.com/aspnet/SignalR/issues/884
    • 哈哈! -1 是怎么回事?这对某人不起作用吗?
    • 响应不正确 - 它说两者都不可能,而第一个实际上是可能的,而第二个可能是由于尝试在未启动连接的情况下发送而引起的。仍然是 SignalR 中的一个错误(注意我们正在谈论一个 alpha 版本),但如果不启动连接,您就无法期望任何东西都会被发送。 (NullReferenceException 的完整堆栈跟踪将有助于指出问题所在,并有助于修复代码以使其正常工作)。
    • 正如您已经明确提到的,此方法是 GlobalHost 的替代方法。它不是类替换,而是替换类的过程。当我说不可能时,我指的是没有直接的班级替换。我这里的代码也是 GlobalHost 的进程替换。这不会使答案出错。
    【解决方案2】:
    1. GlobalHost 已消失。你需要像this sample.一样注入IHubContext&lt;THub&gt;

    2. 这可能是 SignalR alpha1 中的错误。您可以在https://github.com/aspnet/signalr 上提出问题并包含简化的复制品吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-07
      • 2018-09-21
      • 1970-01-01
      • 1970-01-01
      • 2020-04-24
      • 1970-01-01
      相关资源
      最近更新 更多