Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用信号器显示RESTAPI中的实时数据?_C#_Api_Asp.net Core_Signalr - Fatal编程技术网

C# 如何使用信号器显示RESTAPI中的实时数据?

C# 如何使用信号器显示RESTAPI中的实时数据?,c#,api,asp.net-core,signalr,C#,Api,Asp.net Core,Signalr,我有RESTAPI,每隔几分钟返回一次新数据。如何在不使用户每次刷新浏览器的情况下显示新数据? 这就是我目前所拥有的 AppController.cs public IActionResult Index() { string[] day = {"Mon", "Tue", "Wed", "Thu", "Fri"}; List<API> results = new List<API>(); for (var i = 0; i < day.Len

我有RESTAPI,每隔几分钟返回一次新数据。如何在不使用户每次刷新浏览器的情况下显示新数据? 这就是我目前所拥有的

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

@model Site.Models.API
实时数据
数据:

如果您决定从控制器执行此操作,下面的示例将向您展示如何执行此操作。在此示例中,控制器每1秒向所有客户端广播一个人性化字符串。人性化的字符串将包含互联网存在的时间长度。下面的一些代码正在使用fluent 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);
    }
}
公共类UptimeHub:Hub
{
}
公共类背景UptimeServer计时器:iRegistereObject
{
私人只读日期时间_internetBirthDate=1969年10月29日;
专用只读IHubContext_uptimeHub;
私人定时器;
公共背景UptimeServerTimer()
{
_uptimeHub=GlobalHost.ConnectionManager.GetHubContext();
StartTimer();
}
私有void StartTimer()
{
var delayStartby=2.Seconds();
var repeatEvery=1.Seconds();
_计时器=新计时器(BroadcastUptimeToClient、null、delayStartby、repeatEvery);
}
专用无效客户端(对象状态)
{
TimeSpan正常运行时间=DateTime.Now-\u internetBirthDate;
_uptimeHub.Clients.All.internetUpTime(正常运行时间.人性化(5));
}
公共无效停止(bool立即停止)
{
_timer.Dispose();
HostingEnvironment.UnregisterObject(此);
}
}

我从一篇文章中借用了这段代码,并提供了完整的说明。不要忘记注册文章中所示的
BackgroundUptimeServerTimer

您需要做出业务/技术决策,决定是使用轮询(客户端/JS每隔几分钟轮询一次)还是使用推送(控制器每隔几分钟推送一次)。一旦你做出了决定,要么用JS的定时器,要么用c#的控制器。应该有关于如何为两个在线计时器的示例。@CodingYoshi所以我会在控制器中有一个计时器,每隔几分钟刷新一次,然后我会通过信号器推送新数据?
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);
    }
}