我正在尝试通过编写一个非常简单的应用程序来学习 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();
}
}
我收到了 RuntimeBinderException
在 stockTickerHub.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/