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

时间:2017-11-01 18:46:28

标签: c# asp.net-core signalr asp.net-core-signalr

我是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?

感谢您的任何信息!

1 个答案:

答案 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");