Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.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# 随每个请求调用的ASP.NET Web API控制器构造函数_C#_Asp.net Web Api2 - Fatal编程技术网

C# 随每个请求调用的ASP.NET Web API控制器构造函数

C# 随每个请求调用的ASP.NET Web API控制器构造函数,c#,asp.net-web-api2,C#,Asp.net Web Api2,我希望创建一个非常简单的web服务,它随机生成两个数据点的数据,并通过web服务访问这些数据。我决定尝试使用ASP.NETWebAPI 这是我的DataGenerator类: public class DataGenerator { private Random rand; private Double range; private Double sample; private Double scaled; public DataGenerator(st

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

这是我的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; }
}
下面是我的ApicController类,它实例化了两个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;
    }
}
公共类数据生成器控制器:ApiController
{
数据发生器[]发生器;
公共数据生成器控制器()
{
生成器=新数据生成器[]
{
新的数据发生器(“温度”,“华氏度”,0.02000.01000),
新数据发生器(“压力”,“磅/平方英寸”,0.01000.01000)
};
}
公共IEnumerable GetAllDataGenerators()
{
Debug.WriteLine(“Temp=“+generators[0]。Value.ToString()+”Pressure=“+generators[1]。Value.ToString());
回流发生器;
}
}
在调试模式下,我可以在DataGenerator类中很好地看到数据生成,但在ApicController类中它总是显示为0,我发现这是因为每次从浏览器发出请求时它都会被重新实例化

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


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

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


祝你好运。

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


祝你好运。

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

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

一对一意味着,一个控制器控制一个页面,执行所需的操作,一旦您将页面转到另一个页面,就会调用并使用另一个控制器。

一对多、多页使用一个控制器(不推荐使用,这是一种不好的做法)。

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

您可以尝试在这里执行以下操作:

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

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


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

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

一对一意味着,一个控制器控制一个页面,执行所需的操作,一旦您将页面转到另一个页面,就会调用并使用另一个控制器。

一对多、多页使用一个控制器(不推荐使用,这是一种不好的做法)。

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

您可以尝试在这里执行以下操作:

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

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


他可以尝试使用会话或缓存,但问题是内存中的惩罚是否重要。会话是一个对象,将消耗大量内存,有时非常危险。在使用会话和应用程序状态时,您必须从一开始就非常仔细地计划。@BarrJ这就是为什么他应该亲自研究这个主题,他必须先了解应用程序状态,然后再深入研究更复杂的模式,如依赖项注入。我的所有意图都是给大家一些开始的建议;)他可以尝试使用会话或缓存,但问题是内存中的惩罚是否重要。会话是一个对象,将消耗大量内存,有时非常危险。在使用会话和应用程序状态时,您必须从一开始就非常仔细地计划。@BarrJ这就是为什么他应该亲自研究这个主题,他必须先了解应用程序状态,然后再深入研究更复杂的模式,如依赖项注入。我的所有意图都是给大家一些开始的建议;)