【发布时间】:2021-11-05 22:32:39
【问题描述】:
对于我的生活,我无法弄清楚如何将 SignalR 消息仅发送给点击“开始”按钮的客户端,而没有其他人。当我将它发送到“All”时一切正常,但我不知道如何在服务器上获取 connectionID,然后将消息发送到启动客户端。这就是我迄今为止的工作。如果您能告诉我如何仅使用调用客户端来完成这项工作,我将不胜感激 -
这是我的 Default.aspx 文件
<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="SignalR5._Default" %>
<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<div><br /><br />
<asp:Button ID="btnGo" runat="server" Text="GO!!!" OnClick="btnGo_Click" OnClientClick="this.disabled=true;" UseSubmitBehavior="false" /><br /><br />
<asp:Label ID="lblLog" class="#log" runat="server" Text="Begin"></asp:Label> <br /> <br />
<asp:Label ID="lblConnectionID" runat="server" Text=""></asp:Label>
</div>
</ContentTemplate>
</asp:UpdatePanel>
<script src="Scripts/jquery-3.4.1.js"></script>
<script src="Scripts/jquery.signalR-2.4.2.js"></script>
<script src="signalr/hubs"></script>
<script type="text/javascript">
$(function() {
var logger = $.connection.logHub;
logger.client.logMessage = function(msg) {
$("#MainContent_lblLog").html(msg);
};
$.connection.hub.start().done(function () {
var cid = $.connection.hub.id;
$("#MainContent_lblConnectionID").text("ConnectionID: " + cid);
//alert("connection Id:" + cid);
});
});
</script>
</asp:Content>
这是我的 Default.aspx.cs 文件
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Threading;
using System.Diagnostics;
namespace SignalR5
{
public partial class _Default : Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btnGo_Click(object sender, EventArgs e)
{
//The timer is just to display how long each task takes.
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
string strMessage = "Hello ";
LogHub.SendMessage(strMessage);
Thread.Sleep(2000);
strMessage += "(" + stopWatch.Elapsed.Seconds + " Seconds)<br>what's up bro? ";
stopWatch.Restart();
LogHub.SendMessage(strMessage);
Thread.Sleep(2500);
strMessage += "(" + stopWatch.Elapsed.Seconds + " Seconds)<br>Call me soon ";
stopWatch.Restart();
LogHub.SendMessage(strMessage);
Thread.Sleep(3200);
strMessage += "(" + stopWatch.Elapsed.Seconds + " Seconds)<br>See you later ";
stopWatch.Restart();
LogHub.SendMessage(strMessage);
Thread.Sleep(1800);
strMessage += "(" + stopWatch.Elapsed.Seconds + " Seconds)<br>Okay man. See you ";
stopWatch.Restart();
LogHub.SendMessage(strMessage);
Thread.Sleep(2900);
strMessage += "(" + stopWatch.Elapsed.Seconds + " Seconds)<br>We're all Done!";
lblLog.Text = strMessage;
stopWatch.Stop();
}
}
}
这是我的 Startup1.cs 文件
using Microsoft.Owin;
using Owin;
using System;
using System.Threading.Tasks;
[assembly: OwinStartup(typeof(SignalR5.Startup1))]
namespace SignalR5
{
public class Startup1
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR();
}
}
}
这是我的 LogHub.cs 文件
using Microsoft.AspNet.SignalR;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace SignalR5
{
public class LogHub : Hub
{
// This is the only one working, but I don't want to send to all clients.
public static void SendMessage(string strMessage)
{
var hub = GlobalHost.ConnectionManager.GetHubContext("LogHub");
hub.Clients.All.logMessage(strMessage);
}
}
}
正如我所提到的,我很难弄清楚如何将其发送给“调用者”客户端。它适用于“所有”。
【问题讨论】:
-
尝试发送连接 ID (here you will get an idea about connection id),然后使用该连接 ID 而不是这样做 -
hub.Clients.All.logMessage(strMessage);,发送此hub.Clients.Client(yourConnectionId).logMessage(strMessage); -
向我们展示您接受连接并将其与用户关联的代码部分
-
@TBA,老实说,我不知道如何在服务器端获取 connectionid。我可以在客户端得到它。我花了好几天才写出上面的代码。无论如何,您可以给我更多详细信息或告诉我我需要在上面修改什么以获得 connectionId?
-
@CaiusJard,不幸的是,以上就是我所拥有的。我已经尝试了几天,无法弄清楚如何将其发送给调用客户端。
-
这是一个新项目还是对现有项目的改造?