【问题标题】:ASP.NET Web API controller constructor called with each request每个请求都会调用 ASP.NET Web API 控制器构造函数
【发布时间】:2015-09-06 05:42:09
【问题描述】:

我希望创建一个非常简单的 Web 服务,它可以为两个数据点随机生成数据,并通过 Web 服务访问这些数据。我决定尝试使用 ASP.NET Web API。

这是我的 DataGenerator 类:

public class DataGenerator
{
    private Random rand;
    private Double range;
    private Double sample;
    private Double scaled;

    public DataGenerator(string name, string units, double min, double max, int updateRate)
    {
        try
        {
            Name = name;
            Units = units;
            Min = min;
            Max = max;
            UpdateRate = updateRate;

            Timer timer = new Timer();
            timer.Interval = updateRate;
            timer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
            timer.Start();

            rand = new Random();
            range = max - min;
            Debug.WriteLine("Instantiated");
        }
        catch (Exception ex)
        {
            Debug.WriteLine("Error in Data Generator: " + ex.Message);
        }

    }

    private void OnTimedEvent(object sender, ElapsedEventArgs e)
    {
        try
        {
            range = Max - Min;
            sample = rand.NextDouble();
            scaled = (sample * range) + Min;

            Value = scaled;
            Debug.WriteLine("Value = " + Value);
        }
        catch (Exception ex)
        {
            Debug.WriteLine("Error in Data Generator: " + ex.Message);
        }
    }

    public string Name { get; }
    public string Units { get; }
    public double Min { get; set; }
    public double Max { get; set; }
    public int UpdateRate { get; set; }
    public double Value { get; private set; }
}

这是我的 ApiController 类,它实例化了两个 DataGenerator 对象:

public class DataGeneratorsController : ApiController
{
    DataGenerator[] generators;

    public DataGeneratorsController()
    {
        generators = new DataGenerator[]
        {
            new DataGenerator("Temperature", "deg F", 0.0, 200.0, 1000),
            new DataGenerator("Pressure", "psi", 0.0, 100.0, 1000)
        };
    }

    public IEnumerable<DataGenerator> GetAllDataGenerators()
    {
        Debug.WriteLine("Temp = " + generators[0].Value.ToString() + " Pressure = " + generators[1].Value.ToString());
        return generators;
    }
}

在调试模式下,我可以在 DataGenerator 类中看到数据生成得很好,但它在 ApiController 类中始终显示为 0,我发现这是因为每次都会重新实例化请求是从浏览器发出的。

我该如何解决这个问题?我不明白为什么每次都会调用构造函数。我在网上找到了很多关于依赖注入的东西,但我不明白这如何解释我的问题。

我可能在这里遗漏了一些非常明显的东西,因为我是 C# 和 Web API 的新手。

【问题讨论】:

    标签: c# asp.net-web-api2


    【解决方案1】:

    默认服务行为是无状态的,这意味着 - 是的,它每次都会被实例化。
    在网上阅读有关 asp.net 中应用程序状态的信息。
    阅读有关 Session 对象、Cache 对象、Application 对象以及数据库中数据持久性的一些信息。

    祝你好运。

    【讨论】:

    • 他可以尝试使用会话或缓存,但问题是内存中的惩罚是否重要。会话一个对象,会消耗大量内存,有时风险很大。使用会话和应用程序状态时,您必须从一开始就非常仔细地计划它。
    • @BarrJ 这就是为什么他应该自己研究这个主题的原因,他必须先了解应用程序状态,然后再深入研究依赖注入等更复杂的模式。我的所有意图都是给出一些指示,从 ;)
    【解决方案2】:

    这是因为此控制器不是特定于页面的,请注意 MVC 行为

    控制器具有一对一关系,或一对多关系取决于您如何使用它。

    一对一表示,一个控制器控制一个页面,执行所需的操作,一旦您将页面留给另一个,然后调用和使用另一个控制器。

    一对多,多于一个页面使用一个控制器(不推荐,也是不好的做法)。

    你在这里所做的,是一对多的,这意味着每次你想进入一个页面时,控制器都会被调用,数据会被重置,所有的方法都会开始一个新的。

    你可以在这里尝试做的是:

    1) 使用依赖项来尝试防止数据重置:

    Dependency introduction

    2) 扩展控制器行为,因此不会在每次调用时重置:

    Controllers action filter tutorial

    【讨论】:

      猜你喜欢
      • 2013-03-08
      • 1970-01-01
      • 2018-05-25
      • 2020-01-31
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      • 2018-09-30
      • 1970-01-01
      相关资源
      最近更新 更多