Как отобразить живые данные из REST API с помощью SignalR? - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть REST API, которые возвращают новые данные каждые пару минут. Как отобразить новые данные, не заставляя пользователя каждый раз обновлять браузер? Это то, что у меня есть.

AppController.cs

public IActionResult Index()
{
    string[] day = {"Mon", "Tue", "Wed", "Thu", "Fri"};
    List<API> results = new List<API>();
    for (var i = 0; i < day.Length; i++)
    {
        var client = new RestClient("https://api.example.com/values/d=" + day[i]);
        var request = new RestRequest(Method.GET);
        request.AddHeader("cache-control", "no-cache");
        request.AddHeader("accept", "application/json; charset=utf-8");
        IRestResponse response = client.Execute(request);
        var responseContent = response.Content;

        results.Add(new JavaScriptSerializer().Deserialize<API>(responseContent));
    }

    return View(results);
}

APIHub.cs

using Microsoft.AspNetCore.SignalR;
using System.Threading.Tasks;

namespace SignalRAPI.Hubs
{
    public class APIHub : Hub
    {
        public async Task SendData(   )
        {
            await Clients.All.SendAsync(    );
        }
    }
}

index.cshtml

@model Site.Models.API

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Live data</title>
</head>

<body>
<div><h3>Data: <h3></div>
<div class="APIDataResult" id="APIDataResult>@Html.DisplayFor(modelItem => model.APIdata)</div>
<script>
        var connection = new signalR.HubConnectionBuilder()
                                    .withUrl('/APIHub')
                                    .build();
        connection.on({        });
        connection.start(   )
</script>
</body>
</html>

1 Ответ

0 голосов
/ 07 ноября 2019

Если вы решили сделать это с контроллера, вот пример, чтобы показать вам, как. В этом примере контроллер передает гуманизированную строку всем клиентам каждую 1 секунду. Гуманизированная строка будет содержать промежуток времени, в течение которого Интернет был вокруг. Часть приведенного ниже кода использует свободный API для DateTime и т. Д., Поэтому не позволяйте этому сбить вас с толку. Идея остается прежней.

public class UptimeHub : Hub
{
}
public class BackgroundUptimeServerTimer : IRegisteredObject
{
    private readonly DateTime _internetBirthDate = On.October.The29th.In(1969);
    private readonly IHubContext _uptimeHub;
    private Timer _timer;


    public BackgroundUptimeServerTimer()
    {
        _uptimeHub = GlobalHost.ConnectionManager.GetHubContext<UptimeHub>();

        StartTimer();
    }
    private void StartTimer()
    {
        var delayStartby = 2.Seconds();
        var repeatEvery = 1.Seconds();

        _timer = new Timer(BroadcastUptimeToClients, null, delayStartby, repeatEvery);
    }
    private void BroadcastUptimeToClients(object state)
    {
        TimeSpan uptime = DateTime.Now - _internetBirthDate;

        _uptimeHub.Clients.All.internetUpTime(uptime.Humanize(5));
    }

    public void Stop(bool immediate)
    {
        _timer.Dispose();

        HostingEnvironment.UnregisterObject(this);
    }
}

Я позаимствовал этот код из статьи, и полные инструкции доступны здесь . Не забудьте зарегистрировать BackgroundUptimeServerTimer, как показано в статье.

...