.Net Core 2/SignalR:从控制器解析当前连接的 API 客户端

.Net Core 2/SignalR: Resolving currently connected API client from a controller

我是 SignalR(核心版本,目前为 1.0.0-alpha2-final)的新手。 我有一个从控制器操作呈现的视图,页面与几个 APIs 交互而无需重新加载。我想从其他(API 样式)控制器方法更新页面的某些部分,这些方法本身没有 return 任何内容。 因此索引视图呈现带有控件的页面,并且还连接到 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。样本中有一个映射到用户身份的示例,但这没有用,因为该页面可以由匿名用户呈现。我如何接收请求 API 的客户端的连接 ID,同时他的浏览器连接到 SignalR?

感谢您提供任何信息!

如评论中所述,我认为没有答案,因为集线器的连接 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");