簡體   English   中英

.Net Core 2/SignalR:從控制器解析當前連接的 API 客戶端

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

我是 SignalR 的新手(核心版本,目前是 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?

感謝您提供任何信息!

正如評論中提到的,我認為沒有答案,因為集線器的連接 ID 僅在集線器內可用,並且需要努力跟蹤整個站點的匿名用戶才能使用我現在正在做的事情。 由於組件無論如何都需要授權,我現在在連接到集線器時使用用戶名創建組。

public override Task OnConnectedAsync()
{
    Groups.AddAsync(Context.ConnectionId, Context.User.Identity.Name);  
    return base.OnConnectedAsync();
}

這允許我訪問注入的集線器上下文

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM