gpt4 book ai didi

c# - 服务端如何获取signalR客户端的连接ID?

转载 作者:IT王子 更新时间:2023-10-29 03:54:41 28 4
gpt4 key购买 nike

我需要获取客户端的连接 ID。我知道您可以使用 $.connection.hub.id 从客户端获取它。我需要的是在我拥有的 Web 服务中进入,该服务更新数据库中的记录,然后在网页上显示更新。我是 signalR 和 stackoverflow 的新手,所以任何建议都将不胜感激。在我的客户端网页上,我有这个:

<script type="text/javascript">
$(function () {
// Declare a proxy to reference the hub.
var notify = $.connection.notificationHub;

// Create a function that the hub can call to broadcast messages.
notify.client.broadcastMessage = function (message) {
var encodedMsg = $('<div />').text(message).html();// Html encode display message.
$('#notificationMessageDisplay').append(encodedMsg);// Add the message to the page.
};//end broadcastMessage

// Start the connection.
$.connection.hub.start().done(function () {
$('#btnUpdate').click(function () {
//call showNotification method on hub
notify.server.showNotification($.connection.hub.id, "TEST status");
});
});


});//End Main function


</script>

一切正常,直到我想使用 signalR 更新页面。我中心的显示通知功能是这样的:

//hub function
public void showNotification(string connectionId, string newStatus){
IHubContext context = GlobalHost.ConnectionManager.GetHubContext<notificationHub>();
string connection = "Your connection ID is : " + connectionId;//display for testing
string statusUpdate = "The current status of your request is: " + newStatus;//to be displayed
//for testing, you can display the connectionId in the broadcast message
context.Clients.Client(connectionId).broadcastMessage(connection + " " + statusUpdate);
}//end show notification

如何将 connectionid 发送到我的网络服务?

希望我不是在尝试做一些不可能的事情。提前致谢。

最佳答案

当客户端调用服务器端的函数时,您可以通过 Context.ConnectionId 检索它们的连接 ID .现在,如果您想通过集线器外部的机制访问该连接 ID,您可以:

  1. 只需让 Hub 调用传入连接 ID 的外部方法即可。
  2. 管理连接的客户端列表,如 public static ConcurrentDictionary<string, MyUserType>...通过添加到 OnConnected 中的字典并从中删除 OnDisconnected .获得用户列表后,您就可以通过外部机制查询它。

示例 1:

public class MyHub : Hub
{
public void AHubMethod(string message)
{
MyExternalSingleton.InvokeAMethod(Context.ConnectionId); // Send the current clients connection id to your external service
}
}

示例 2:

public class MyHub : Hub
{
public static ConcurrentDictionary<string, MyUserType> MyUsers = new ConcurrentDictionary<string, MyUserType>();

public override Task OnConnected()
{
MyUsers.TryAdd(Context.ConnectionId, new MyUserType() { ConnectionId = Context.ConnectionId });
return base.OnConnected();
}

public override Task OnDisconnected(bool stopCalled)
{
MyUserType garbage;

MyUsers.TryRemove(Context.ConnectionId, out garbage);

return base.OnDisconnected(stopCalled);
}

public void PushData(){
//Values is copy-on-read but Clients.Clients expects IList, hence ToList()
Clients.Clients(MyUsers.Keys.ToList()).ClientBoundEvent(data);
}
}

public class MyUserType
{
public string ConnectionId { get; set; }
// Can have whatever you want here
}

// Your external procedure then has access to all users via MyHub.MyUsers

希望这对您有所帮助!

关于c# - 服务端如何获取signalR客户端的连接ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20908620/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com