从控制器操作

时间:2016-05-14 05:15:27

标签: javascript jquery asp.net signalr

我似乎在使用SignalR从控制器操作发送警报(toast)消息时遇到问题。除非我在发送呼叫后添加Thread.Sleep(),否则我从未看到该消息。发送调用不可避免地发生在return View()之前,所以我想在前一个视图上可以看到警报一毫秒,直到新服务被提供为止。

我的第一个粗略的解决方案是使用计时器继续发送消息,直到我收到确认。

这个解决方案很糟糕。我还可以做些什么?我可以接受'页面轮询服务器以查看它们是否有任何警报,但这违背了SignalR的目的。

但是,也许SignalR不适合我的情况,我应该在模型上将警报作为json字符串发送。

来自Login行动:

....
//ModelState.AddModelError("", "Invalid login attempt.");
AlertsHub.ShowClientAlert(new Alert(AlertLevel.Error, "Invalid login attempt."));
return View(model);

集线器:

public class AlertsHub : Hub
{
    private static Alert pendingAlert;
    static Timer pollTimer;

    internal static void ShowClientAlert(Alert alert)
    {
        if (pendingAlert != null)
        {
            return;
        }
        pendingAlert = alert;
        pollTimer = new Timer(_ => SendAlert(pendingAlert), null, 0, 500);
    }

    static private void SendAlert(Alert alert)
    {
        IHubContext context = GlobalHost.ConnectionManager.GetHubContext<AlertsHub>();
        context.Clients.All.ShowAlert(alert.Level.ToString(), alert.Message, alert.Title);
    }

    [HubMethodName("AlertReceived")]
    public void AlertReceived(Guid alertId)
    {
        pollTimer.Dispose();
        pendingAlert = null;
    }
}

来自JS:

var toast;

$(function () {
    if (typeof toast != 'undefined' && toast != null) {
        showToast(toast);
        toast = null;
    }

    var alertsProxy = $.connection.alertsHub;

    alertsProxy.client.showAlert = function(alertId, level, message, title) {
        toast.alertId = alertId;
        toast.level = level;
        toast.message = message;
        toast.title = title;
    };

    $.connection.hub.start()
        .done(function () {
            console.log('Now connected, connection ID=' + $.connection.hub.id);
        })
        .fail(function () {
            console.log('Could not Connect!');
        });
});

function showToast(toast) {
    switch (toast.level.toLowerCase()) {
    case "success":
        toastr.success(toast.message, toast.title);
        break;
    ...
    }

    alertsProxy.server.AlertReceived(alertId)
        .done(function() {
            console.log("Alert '" + alertId + "' acknowledged.");
        })
        .fail(function() {
            console.log("Acknowledgement of alert '" + alertId + "' failed.");
        });
}

0 个答案:

没有答案