簡體   English   中英

將服務器生成的事件發送給客戶端

[英]Sending server generated events to the client

我有一個Hub

public sealed class NewValueHub : Hub
{
  private IDataRelay _dataRelay;
  private IConfig _configurator;
  public NewValueHub(IDataRelay dataRelay, IConfig configurator)
  {
    _dataRelay = dataRelay;
    _configurator = configurator;
    _dataRelay.NewData += HandleNewData; //this gets unassigned on dispose.
  }

  public string GetMachineID()
  {
    IReadOnlyDictionary<string, string> config = _configurator.GetReadOnlyConfig();

    string id;

    if (config.TryGetValue("machineID", out id))
    {
        return id;
    }

    throw new HubException(Resource.machine_id_error);
  }

  private void HandleNewData(object? sender, string value)
  {
    Clients.All.SendAsync("ValueUpdate", value);
  }
}

還有一個 javascript 客戶端:

const connection = new signalR.HubConnectionBuilder().withAutomaticReconnect().withUrl("/newValueHub").build();

connection.on("ValueUpdate", function(value) { console.log(value); });

async function run(connection)
{
    try
    {
        await connection.start();
        let machineid = await connection.invoke('GetMachineID');
        console.log('machine id', machineid);
    }
    catch (err)
    {
        console.error(err);
    }
}

run(connection);

我知道IDataRelay正在工作,因為另一個線程正在將值記錄到文件中。

當我加載頁面時,控制台會記錄機器 ID,所以我知道connection有效。

但是,我從未在控制台中看到任何新值。

我知道集線器不存在很長時間,這可能是問題所在,那么我打算如何處理服務器事件?

我的意思是,當有來自IDataRelay的數據時,我怎樣才能讓 signalR 將其發送給我的客戶?

您想使用后台服務https://docs.microsoft.com/en-us/aspnet/core/signalr/background-services?view=aspnetcore-6.0#call-a-signalr-hub-from-a-background -服務

在您的情況下,您沒有需要等待的循環,因此您可以連接事件處理程序。

我不明白 HandleNewData 事件來自哪里。

根據davidfowl 的建議,我添加了一個處理事件的IHostedService

public class DataRelayWorker : IHostedService, IDisposable
{
  private readonly IDataRelay _dataRelay;
  private readonly IHubContext<NewValueHub> _hubcontext;

  public DataRelayWorker(IDataRelay dataRelay, IHubContext<NewValueHub> context)
  {
    _dataRelay = dataRelay;

    _dataRelay.NewData += BoadcastValue;

    _hubContext = context;
  }

  private void BroadcastValue(object? sender, string value)
  {
    _hubcontext.Clients.All.SendAsync("ValueUpdate", value);
  }

  public void Dispose()
  {
    _dataRelay.NewData -= BoadcastValue;
  }
}

這是通過將以下內容添加到Program.cs來運行的

builder.Services.AddHostedService<DataRelayWorker>();

我已經從集線器中刪除了與IDataRelay的任何內容。

暫無
暫無

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

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