我在我的 ASP.NET Core MVC 專案中使用 signalR 向用戶推送通知。我在這里研究了類似的問題,但它的解決方案并沒有解決我的問題。我使用了以下 Javascript/jQuery 參考:
<script type="text/javascript" src="../../js/UserPage/jquery-3.6.0.min.js"></script>
<script src="~/microsoft/signalr/dist/browser/signalr.js"></script>
<script src="~/js/message.js"></script>
message.js 如下:
var connection = new signalR.HubConnectionBuilder().withUrl("/Home/Messages").withAutomaticReconnect().build();
connection.start();
if (document.getElementById("sendBtn") != null) {
document.getElementById("sendBtn").addEventListener("click", function () {
var costCenter = $("#cost-center").val();
connection.invoke("SendMessage", costCenter).catch(function (err) {
return console.error(err);
});
});
}
集線器的代碼:
public class MessageHub : Hub
{
//Dependency injections
private readonly IUserRepository _userRepository;
private readonly ICostCenterRepository _costcenterRepository;
private readonly IHttpContextAccessor _httpContext;
public MessageHub(IUserRepository userRepository, ICostCenterRepository costcenterRepository, IHttpContextAccessor httpContext)
{
_userRepository = userRepository;
_costcenterRepository = costcenterRepository;
_httpContext = httpContext;
}
public async Task SendMessage(string costCenter)
{
var HttpContext = _httpContext.HttpContext;
string userId = _userRepository.GetUserIdByCostCenter(costCenter).ToString();
string sender = HttpContext.Session.GetString("department");
await Clients.User(userId).SendAsync("ReceiveMessage", sender);
}
}
而且,主頁中的javascript代碼是:
<script>
$(document).ready(function(){
connection.on("ReceiveMessage", function (param) {
if($('#badge-count').length){
var currentMessageNum = parseInt($('#badge-count').text());
$('#badge-count').text(currentMessageNum 1);
$('.main-msg-list').prepend('<li><a style="font-family: vazir !important" asp-controller="Messages" asp-action="Index" href="" id="msg-' currentMessageNum 1 '">???? ???? ?? ' param '</a></li>');
}else{
$('#badge-count').text('1');
}
});
});
</script>
問題是通知在強制重繪 后更新。之后,通知作業正常并立即更新。我該如何解決?
uj5u.com熱心網友回復:
我通過對 Hub 代碼進行一些更改來解決此問題:
[Authorize]
public class MessageHub : Hub
{
//Dependancy injections
private readonly IUserRepository _userRepository;
private readonly ICostCenterRepository _costcenterRepository;
private readonly IHttpContextAccessor _httpContext;
public MessageHub(IUserRepository userRepository, ICostCenterRepository costcenterRepository, IHttpContextAccessor httpContext)
{
_userRepository = userRepository;
_costcenterRepository = costcenterRepository;
_httpContext = httpContext;
}
//define a dictionary to store the userid.
private static Dictionary<string, List<string>> NtoIdMappingTable = new Dictionary<string, List<string>>();
public override async Task OnConnectedAsync()
{
var username = Context.User.Identity.Name;
var userId = Context.UserIdentifier;
List<string> userIds;
//store the userid to the list.
if (!NtoIdMappingTable.TryGetValue(username, out userIds))
{
userIds = new List<string>();
userIds.Add(userId);
NtoIdMappingTable.Add(username, userIds);
}
else
{
userIds.Add(userId);
}
await base.OnConnectedAsync();
}
public override async Task OnDisconnectedAsync(Exception exception)
{
var username = Context.User.Identity.Name;
//remove userid from the List
if (NtoIdMappingTable.ContainsKey(username))
{
NtoIdMappingTable.Remove(username);
}
await base.OnDisconnectedAsync(exception);
}
public async Task SendMessage(string costCenter)
{
var HttpContext = _httpContext.HttpContext;
string username = _userRepository.GetUsernameByCostCenter(costCenter).ToString();
var userId = NtoIdMappingTable.GetValueOrDefault(username);
string sender = HttpContext.Session.GetString("department");
await Clients.User(userId.FirstOrDefault()).SendAsync("ReceiveMessage", sender);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/410868.html
標籤:
