SignalR 无法调用非委托(delegate)类型

标签 signalr

我正在尝试通过编写一个非常简单的应用程序来学习 SignalR……它基本上定期发送“Hello”(如 Stock Ticker,但要简单得多)。
这是我的中心:

public class StockTickerHub : Hub
{
    public void Hello()
    {
        var s = StockTicker.stockTicker;

        Clients.All.hello();
    }
}
...这是应该定期发送消息的代码:
public class StockTicker
{
    public static StockTicker stockTicker = new StockTicker();
    private Thread thread;

    public StockTicker()
    {
        var stockTickerHub = GlobalHost.ConnectionManager.GetHubContext<StockTickerHub>();

        this.thread = new Thread(() =>
            {
                while (true)
                {
                    stockTickerHub.Clients.All().hello();
                    Thread.Sleep(1000);
                }
            }
        );

        this.thread.Start();
    }
}
我收到了 RuntimeBinderExceptionstockTickerHub.Clients.All().hello(); .它说:

An unhandled exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in System.Core.dll

Additional information: Cannot invoke a non-delegate type


我究竟做错了什么?
下面是客户端 JavaScript,以防万一您需要复制它。
<script type="text/javascript">
    $(function () {
        
        var chat = $.connection.stockTickerHub;

        chat.client.hello = function () {
            $("#log").append("Hello");
        }

        $.connection.hub.start().done(function () {

            chat.server.hello();
        });
    });
</script>

最佳答案

简单地改变:

stockTickerHub.Clients.All().hello();

到:
stockTickerHub.Clients.All.hello();

调试器应该已经告诉你这个错误。我在更新后尝试了您的代码。这是工作。

关于代码设计的备注:

我不会在 hello 中启动新的发送线程事件,每次任何客户端调用此方法时都会启动一个。我不认为那是你想要做的。作为一个更流畅的示例,您可以在 Startup 中启动代码。类(class)。 (如果您想要每个连接覆盖 OnConnected 的代码,请获取客户端的连接 ID 并给它们单独的代码......)

关于SignalR 无法调用非委托(delegate)类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31903620/

相关文章:

asp.net - SignalR ASP.NET MVC5 标识

c# - SignalR Core在Android客户端上断开连接

SignalR - 找不到类型或命名空间名称 'Hub'

c# - 如何为每个连接获取用户?

signalr - SignalR-如何禁用WebSockets

c# - 从 Controller 方法调用 signalR 服务器方法时出错

javascript - SignalR 仅在事件 SILO 中可用

c# - 将 REST Web API 应用程序与 SignalR 集成?

SignalR 在通过 LoadBalancer 运行时无法向组发送消息

c# - 不使用 FCM 为 Xamarin.Android 创建推送通知