SignalR无法调用非委托类型

Gig*_*igi 4 signalr

我正在尝试通过编写一个非常简单的应用程序来学习SignalR ...它基本上定期发送"Hello"(比如股票代码,但更简单).

这是我的中心:

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

        Clients.All.hello();
    }
}
Run Code Online (Sandbox Code Playgroud)

...这里是应该定期发送消息的代码:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到一个RuntimeBinderExceptionstockTickerHub.Clients.All().hello();.它说:

System.Core.dll中发生未处理的"Microsoft.CSharp.RuntimeBinder.RuntimeBinderException"类型异常

附加信息:无法调用非委托类型

我究竟做错了什么?

客户端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>
Run Code Online (Sandbox Code Playgroud)

DDa*_*Dan 16

只需更改:

stockTickerHub.Clients.All().hello();
Run Code Online (Sandbox Code Playgroud)

至:

stockTickerHub.Clients.All.hello();
Run Code Online (Sandbox Code Playgroud)

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

关于代码设计的评论:

我不会在hello事件中启动一个新的发送线程,每次这个方法被任何客户端调用时都会启动它.我不认为那是你想做的.作为一个更平滑的例子,你可以在Startup课堂上启动自动收报机.(如果你想要每个连接覆盖一个滚动条OnConnected,获取客户端的连接ID并给它们单独的代码......)