【问题标题】:.Net Core 2/SignalR: Resolving currently connected API client from a controller.Net Core 2/SignalR:从控制器解析当前连接的 API 客户端
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 我不知道我在这里做错了什么,但是方法“InvokeAsync”无法访问,所以我在这里找到了这个“SendAsync”,它按我的预期工作。
  • 自从上面写了(1.0.0-alpha2-final),发布了新版本,使上面的一些内容过时了。始终检查最新版本,我相信目前是 1.0.3。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多