Как передать данные из файла класса на страницу razor?

#c# #blazor-server-side

Вопрос:

Я пытаюсь создать серверную программу с веб-интерфейсом, используя сервер blazor. Но я не могу найти способ передать данные из моего серверного класса в мой индексный файл. В этом проекте у меня есть 2 основные проблемы.

1 — Пользовательский интерфейс не обновляется, когда клиент подключается к серверу и его объект хранится в словаре.

2 — Я не могу понять, как передать сообщения об ошибках из моего серверного класса в файл razor (индекс).

Несмотря на то, что я пытаюсь сделать эти материалы непосредственно из своего серверного класса, я хотел бы сделать их из класса промежуточного ПО, который будет получать данные из серверного класса, а затем передавать их в мой индексный файл.

Что я хотел бы сделать:

Индекс.бритва

 @page "/"
@using System.Net.Sockets
@using System.Threading
@inject Server server

<table class="table">
  <thead>
        <tr>
            <th scope="col">Dispositivos</th>
            <th scope="col">IP</th>
            <th scope="col">Porta</th>
        </tr>
  </thead>
  <tbody>
        <tr>
            <td>Servidor</td>
            <td>127.0.0.1</td>
            <td>8600</td>
        </tr>
        @* Remove this and get data from my middleware class *@
        @foreach (KeyValuePair<string, TcpClient> client in server._connectedClients)
        {
            string endpoint = client.Value.Client.RemoteEndPoint.ToString();
            string ip = endpoint.Split(":")[0];
            string port = endpoint.Split(":")[1];
            string device = client.Key;

            <tr>
                <td>@device</td>
                <td>@ip</td>
                <td>@port</td>
            </tr>
        }
  </tbody>
</table>

@code {
    protected override void OnInitialized() {
        Thread serverThread = new Thread(() => server.Start());
        serverThread.Start();
    }
}
 

Класс промежуточного ПО

 class Middleware {
    public string[] AddDeviceEntry(string device, string endpoint) {
       // Return this object to index.razor somehow and update the UI
       return new string[] { device, endpoint }; 
    }

    public string ErrorMessage(string msg) {
        // Return this object to index.razor somehow and update the UI
        return msg;
    }
}
 

Server.cs

 class Server {
    private TcpListener _server;
    private Middleware _mid;
    public Dictionary<string, TcpClient> _connectedClients = new();

    public Server(int portNum, Middleware middleware) {
        _server = new TcpListener(IPAddress.Any, portNum);
        _mid = middleware;
    }

    // Some stuffs...

    // When client connects
    _connectedClients.Add("some device", client);
    _mid.AddDeviceEntry("some device", client.Client.RemoteEndPoint.ToString());

    // When getting some error
    _mid.ErrorMessage("some error message");
}