繁体   English   中英

每个请求都调用ASP.NET Web API控制器构造函数

[英]ASP.NET Web API controller constructor called with each request

我希望创建一个非常简单的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都是新手,所以这里可能会遗漏一些非常明显的东西。

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

祝好运。

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

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

一对一的方式是,一个控制器控制一个页面,执行所需的操作,然后将页面留给另一个控制器,然后调用并使用另一个控制器。

一对多,多于一页使用一个控制器(不建议这样做,这是不正确的做法)。

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

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

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

依赖介绍

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

控制器动作过滤器教程

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM