我是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?
感谢您的任何信息!
答案 0 :(得分:1)
正如评论中所提到的,我认为没有答案,因为Hub的连接ID仅在集线器中可用,并且需要努力跟踪整个站点的匿名用户以使用我现在正在做的事情。 由于组件需要授权,我现在正在创建连接到集线器时具有用户名的组。
public override Task OnConnectedAsync()
{
Groups.AddAsync(Context.ConnectionId, Context.User.Identity.Name);
return base.OnConnectedAsync();
}
这允许我访问注入的hubcontext
private readonly IHubContext<SignalRHub> _signalRHub;
public FooController(IHubContext<SignalRHub> signalRHub)
{
_signalRHub = signalRHub;
}
并从方法中访问它:
_signalRHub.Clients.Group(User.Identity.Name).InvokeAsync("Send", User.Identity.Name + ": Message for you");