ASP.NET MVC 5 Server代码无法调用Javascript客户端SignalR功能

时间:2015-11-16 19:35:23

标签: c# asp.net-mvc signalr nservicebus signalr-hub

在我们的应用程序中,我想要一个用户可以监控的“实时”通知网格。该网格是带有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网格重读?

0 个答案:

没有答案