2016-05-14 8 views
0

SignalRを使用してコントローラのアクションからアラート(トースト)メッセージを送信する際に問題があるようです。私がThread.Sleep()を送信した後に追加しない限り、メッセージは表示されません。必然的に、sendコールはreturn View()より前に発生するため、新しいアラームが表示されるまで、アラートは前のビューのミリ秒間表示されると思います。コントローラのアクションからのSignalRアラートメッセージの送信

私の最初の難しい解決策は、了解を得るまで、タイマーを使用してメッセージを送信し続けることです。

この解決策は嫌です。他に何ができますか? 「受信」ページにサーバーをポーリングしてアラートがあるかどうかを確認することはできますが、これはSignalRの目的に反するものです。

しかし、おそらくSignalRは私の場合には適していないかもしれません。モデルにjson文字列としてアラートを送信するだけです。

Loginアクションから:JSから

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; 
    } 
} 

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

ハブ

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

関連するコードを共有できますか? (コントローラー+ JSの両方がある場合) –

+0

@ PedroG.Diasコードは現時点では少し流動的ですが、私は実験の進行中です。それでもまだ多くの作業が必要です。 – ProfK

答えて

関連する問題