【发布时间】:2018-04-14 04:05:46
【问题描述】:
我是 SignalR 的新手(Core 版本,目前为 1.0.0-alpha2-final)。 我有一个从控制器操作呈现的视图,并且页面与一些 API 交互而无需重新加载。我想从其他(API 样式)控制器方法更新页面的某些部分,这些方法本身不返回任何内容。 所以索引视图渲染一个带有控件的页面,并且还连接到 SignalR。
我拥有的是
<div id="DisplayMessages"></div>
作为消息的占位符。
我的控制器有一个 IHubContext 的依赖注入。
let connection = new signalR.HubConnection("/signalr", { transport: signalR.TransportType.LongPolling });
connection.on('send',
data => {
var DisplayMessagesDiv = document.getElementById("DisplayMessages");
DisplayMessagesDiv.innerHTML += "<br/>" + data;
});
connection.onClosed = e => {
console.log('connection closed');
};
connection.start().then(() => connection.invoke('send', 'Hello'));
function SendMessage() {
var msg = document.getElementById("txtMessage").value;
connection.invoke('send', msg);
}
我可以从我的控制器方法中向所有客户端发送消息,例如
public JsonResult DoSomething([FromBody] DoSomethingParameters parameters)
doSomething();
_signalRHub.Clients.All.InvokeAsync("Send", "Did something with " + parameters.SomeParameter);
我无法弄清楚如何仅将其发送给最初呈现页面的客户端,该页面现在发送给 API。示例中有一个映射到用户身份的示例,但这没有用,因为该页面可以由匿名用户呈现。我如何在他的浏览器连接到 SignalR 的同时接收请求 API 的客户端的连接 ID?
感谢您提供任何信息!
【问题讨论】:
-
再想一想,大概是不可能的。我现在通过使用用户名创建了一个组来帮助自己;组可从 IHubContext 获得。
-
您还可以在用于启动连接的查询字符串中传递任意值。您可以使用它来提供唯一的用户标识符,然后您可以在服务器上使用该标识符来识别您想要向其发送更新的客户端。
-
嗨 Pawel,问题是我无法控制某些生成 API 调用的组件,因此我不一定能确定组件的调用来自实际显示该组件的页面。我猜有点难以解释。我提到的 group 方法确实很幸运。
标签: c# asp.net-core signalr asp.net-core-signalr