Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.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# 通过不同的请求跟踪.net应用程序变量_C#_Asp.net_Application State - Fatal编程技术网

C# 通过不同的请求跟踪.net应用程序变量

C# 通过不同的请求跟踪.net应用程序变量,c#,asp.net,application-state,C#,Asp.net,Application State,在.Net应用程序中,当使用C时,我必须进行一个昂贵的调用,以便向第三方API获取一些数据,这取决于这个API,有时我希望它的速度较慢 问题是,这些数据是准确的,但我自己可以用较低的精度来计算。所以我在想,如果使用我自己的实现,我如何能够跟踪过去5分钟内的平均请求时间,以及它是否大于我的阈值更改 该方法的草图如下所示: public int GetMyData() { return isTooSlow() ? _ownImplementation.GetData(

在.Net应用程序中,当使用C时,我必须进行一个昂贵的调用,以便向第三方API获取一些数据,这取决于这个API,有时我希望它的速度较慢

问题是,这些数据是准确的,但我自己可以用较低的精度来计算。所以我在想,如果使用我自己的实现,我如何能够跟踪过去5分钟内的平均请求时间,以及它是否大于我的阈值更改

该方法的草图如下所示:

    public int GetMyData()
    {
        return isTooSlow() ? _ownImplementation.GetData() : thirdParty.GetData();
    }
即使在理想情况下,我希望能够将第三方封装在一个接口中,我的接口将在运行时实现并更改它,这将是一个很好的选择

但主要的问题是如何在记忆中保持这种状态。我只能考虑使用静态类,并且我已经阅读了ApplicationState的相关内容,但不确定这些是否是最好的方法

此外,不是针对我的小项目,而是如何扩展这些解决方案?如果我必须考虑我的应用程序运行的几个实例,我认为唯一的解决方案是使用外部存储redis或类似的?并在执行检查时查询它

很抱歉,如果问题太笼统,但认为这是一个有趣的问题要解决,不知道如何最好地解决它


谢谢

我将把多个应用程序实例的问题放在次要位置。这并不重要,但如果您是针对接口编程的,那么在某个时候您可以用缓存的东西替换您的实现

如果您希望平均请求时间超过5分钟,那么您需要一个弹出过期条目的列表。这里有一个尝试:

internal class TimestampedEntry<T>
{
    internal DateTimeOffset Timestamp { get; private set; }
    internal T Value { get; private set; }

    internal TimestampedEntry(T value)
    {
        Timestamp = DateTimeOffset.Now;
        Value = value;
    }
}

public class ExpiringList<T> 
{
    private readonly List<TimestampedEntry<T>> _list = new List<TimestampedEntry<T>>();
    private readonly TimeSpan _expiration;

    public ExpiringList(TimeSpan expiration)
    {
        _expiration = expiration;
    }

    public void Add(T item)
    {
        lock (_list)
        {
          _list.Add(new TimestampedEntry<T>(item));              
        }
    }

    public IReadOnlyCollection<T> Read()
    {
        var cutoff = DateTimeOffset.Now - _expiration;
        TimestampedEntry<T>[] result;
        lock (_list)
        {
            result = _list.Where(item => item.Timestamp > cutoff).ToArray();
            _list.Clear();
            _list.AddRange(result);
        }
        return new ReadOnlyCollection<T>(result.Select(item => item.Value).ToList());
    }
}
您的类只依赖于工厂接口。实现IMyDataProviderFactory的类会检查您的平均响应时间,并返回调用外部API的IMyDataProvider实现或使用您的计算的实现

这样,该逻辑的复杂性就与依赖于API的任何类分开了

温莎也很擅长这些。其他DI容器也使它们变得简单,这种功能内置在ASP.NET内核中。您没有询问依赖注入,但我建议您调查一下。它使管理这种复杂性和保持其可维护性变得更容易


回到多个应用程序实例和分布式缓存,您可以看到工厂模式实现如何使其更易于管理。假设今天这是一个实例,但明天您希望通过分布式缓存共享此数据。你在哪里换的?依赖于此API的大多数代码根本不需要更改,因为它不知道这些实现细节。您将更改存储每个API调用的计时的代码,并更改工厂的实现

如果您有自己的实现,那么为什么需要呼叫第三方?或者在几个小时后打电话给第三方,并将数据存储在某个地方,以便您能够更快地获取数据。数据在第三方上实时更新,因此我希望每次都打电话给它,除非它在最后几分钟内几乎没有响应。
interface IMyDataProviderFactory
{
    IMyDataProvider Create();
}