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.");
});
}
関連するコードを共有できますか? (コントローラー+ JSの両方がある場合) –
@ PedroG.Diasコードは現時点では少し流動的ですが、私は実験の進行中です。それでもまだ多くの作業が必要です。 – ProfK