在我们的应用程序中,我想要一个用户可以监控的“实时”通知网格。该网格是带有SignalR传输的 KendoUI网格,并且是只读的。因此,唯一定义的集线器方法是读取方法。
这是我连接到KendoUI网格的中心。:
[HubName( "NotificationsHub" )]
public class NotificationsHub : Hub
{
public IApplicationSupportService Service { get; set; } //injeccted with Autofac
public NotificationsHub()
{
}
public IEnumerable<EventViewModel> Read()
{
var events = from e in Service.FindEvents()
select new EventViewModel
{
EventId = e.EventId,
Text = e.Text,
CreatedOn = e.CreatedOn
};
return events;
}
}
我还有一个NServiceBus消息处理程序,它应该调用名为“addEventToPage”的客户端方法。通知处理程序从服务总线接收一个nevent,并且应该调用所有客户端来更新它们的网格。
这是服务器端的消息处理程序,它使用单例帮助程序通过context.Clients.All.addEventToPage()调用集线器的客户端:
//NServiceBus message handler subscribes to an event, then calls clients
public class NotificationsHandler : IHandleMessages<IBusinessEventReceived>
{
public void Handle( INewEventWasSaved message )
{
NotifyTicker.Instance.UpdateClient( message.EventId, message.Text );
}
}
public class NotifyTicker
{
// Singleton instance
private static readonly Lazy<NotifyTicker> _instance = new Lazy<NotifyTicker>(
() => new NotifyTicker( GlobalHost.ConnectionManager.GetHubContext<NotificationsHub>() ) );
private IHubContext _context;
private NotifyTicker( IHubContext context )
{
_context = context;
}
public static NotifyTicker Instance
{
get { return _instance.Value; }
}
public void UpdateClient( int eventId, string text )
{
_context.Clients.All.addNewEventToPage( eventId, text );
}
}
客户端代码:
<script>
var hubProxy;
var hubStart;
$(function () {
var connection = $.connection;
$.connection.hub.logging = true;
hubProxy = connection.NotificationsHub;
//this function is called by message handler on server
hubProxy.client.addNewEventToPage = function (eventId, text) {
console.log(eventId + ' ' + text);
};
hubStart = $.connection.hub.start()
.done(function () { console.log('Now connected, connection ID=' + $.connection.hub.id); })
.fail(function () { console.log('Could not Connect!'); });
$("#grid").kendoGrid({
editable: false,
columns: [
{ field: "Text" }
],
dataSource: {
type: "signalr",
autoSync: true,
schema: {
model: {
id: "EventId",
fields: {
"EventId": { editable: false, nullable: true },
"Text": { type: "string" }
}
}
},
transport: {
signalr: {
promise: hubStart,
hub: hubProxy,
server: {
read: "read"
},
client: {
read: "read"
}
}
}
}
});
});
</script>
正如您所看到的,我在集线器代理启动之前添加了“addEventToPage
”方法。但这个方法没有调用,期间。
最初,该方法应该向KendoUI网格的数据源添加EventViewModel
,如下所示:
dataSource.add({
EventId: eventId,
Text: text
});
但那没用。它甚至无法写入控制台。
使用网络套接字成功建立连接。我可以在Chrome控制台输出中确认。
我错过了什么?
在没有客户端客户端功能的情况下更新网格是否有更好的方法?也许我可以告诉teh网格重读?