[英]How can I send the message to a specific user using the user's email address stored in db?
我在 ASP.NET Core 2.1 MVC SignalR 有一個項目。 當我開始這個項目時,我沒有授權 select 個人帳戶選項。 我想使用存儲在數據庫中的用戶的 email 地址而不是連接 ID 發送消息,但我無法實現這一點。 我該如何解決這個問題?
這是我的集線器 class 代碼:
public class SignalRChat:Hub
{
Context c = new Context();
public async Task setUserEmail(string email)
{
string id = Context.ConnectionId;
c.EmailConnectionIds.Where(a => a.connection_id == id).FirstOrDefault().email = email;
}
public async Task ClientSendMessage(string connectionId,string user, string message)
{
var deger= c.EmailConnectionIds.Where(a => a.connection_id ==
connectionId).FirstOrDefault();
await Clients.Client(deger.connection_id).SendAsync("ReceiveMessage",user, message);
}
public override async Task OnConnectedAsync()
{
EmailConnectionId val = new EmailConnectionId();
val.connection_id = Context.ConnectionId; ;
val.email = "";
c.EmailConnectionIds.Add(val);
c.SaveChanges();
await base.OnConnectedAsync();
}
public override Task OnDisconnectedAsync(Exception exception)
{
var connection = c.EmailConnectionIds.Where(a => a.connection_id ==
Context.ConnectionId).FirstOrDefault();
if (connection != null)
{
c.EmailConnectionIds.Remove(connection);
}
return base.OnDisconnectedAsync(exception);
}
}
這是我的代碼:
"use strict";
$(document).ready(() => {
var connection = new signalR.HubConnectionBuilder().withUrl("/chathub").build();
var email = $("#client").val();
connection.start().then(() => connection.invoke('setUserEmail ', email));
$("#msg-send").click(() => {
let message = $("#txtMessage").val();
$("#txtMessage").val(" ");
var user = $("#sender").val();
connection.invoke("ClientSendMessage", $("#client").val(), user, message)
.catch(error => console.log("Error." + error));
var div = document.createElement("div");
div.textContent = message;
document.getElementById("chat-cont").appendChild(div);
});
connection.on("ReceiveMessage", function (user, message) {
var msg = message.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
var encodedMsg = msg;
var div = document.createElement("div");
div.textContent = encodedMsg;
document.getElementById("chat-cont").appendChild(div);
});
});
HTML 代碼:
<div class="container">
<div id="chat-cont" class="clearfix" style="max-height:450px;overflow:scroll;">
</div>
<div style="margin-top:470px;margin-left:40%;bottom:50px !important;" class="footer navbar-fixed-bottom">
<div class="row">
<h5>Connection ID : <span id="connectionId"></span></h5>
</div>
<div class="row">
<div class="col-md-7"><input type="text" id="sender" value="@ViewBag.message"></div>
</div>
<div class="row">
<div class="col-md-7"><input type="text" placeholder="ReceiverId" id="client"></div>
</div>
<div class="row">
<div class="col-md-7" style="position:relative;"> <input type="text" id="txtMessage" class="form-control" style="width:70%;"></div>
<div class="col-md-5" style="position:absolute;margin-left:40%;"> <button id="msg-send" class="btn btn-success">Send</button></div>
</div>
</div>
</div>
我建議您創建一個當前連接列表CurrentConnections
static HashSet<EmailConnectionID> CurrentConnections = new HashSet<EmailConnectionID>();
class EmailConnectionID
{
public string email { get; set; }
public string connection_id { get; set; }
}
將條目添加到 CurrentConnections OnConnectedAsync
public override async Task<Task> OnConnectedAsync()
{
EmailConnectionID val = new EmailConnectionID();
val.connection_id = Context.ConnectionId; ;
val.email = "";
CurrentConnections.Add(val);
return base.OnConnectedAsync();
}
然后在客戶端連接后,您要做的第一件事是將 email 發送到hub
並使用 email 編輯 CurrentConnections 列表中的條目
public async Task setUserEmail(string email)
{
string id = Context.ConnectionId;
CurrentConnections.Where(a => a.connection_id == id).FirstOrDefault().email = email;
}
您應該從 CurrentConnections 列表OnDisconnectedAsync
中刪除實體
public override Task OnDisconnectedAsync(Exception exception)
{
var connection = CurrentConnections.Where(a => a.connection_id ==
Context.ConnectionId).FirstOrDefault();
if (connection != null)
{
CurrentConnections.Remove(connection);
}
return base.OnDisconnectedAsync(exception);
}
之后您可以根據 email 地址發送
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.