ASP.NET Web API 每个请求都会调用控制器构造函数
ASP.NET Web API controller constructor called with each request
我想创建一个非常简单的 Web 服务,它可以为两个数据点随机生成数据,并使该数据可通过 Web 服务访问。我决定尝试使用 ASP.NET Web API。
这是我的 DataGenerator class:
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 class,它实例化了两个 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 class 中生成的数据很好,但它在 ApiController class 中始终显示为 0,我发现这是因为每次从浏览器发出请求时它都会重新实例化。
我该如何解决这个问题?我不明白为什么每次都会调用构造函数。我在网上发现了很多关于依赖注入的东西,但我不明白这是如何解释我的问题的。
我可能遗漏了一些非常明显的东西,因为我是 C# 和 Web 的新手 API。
默认服务行为是无状态的,这意味着 - 是的,它每次都会被实例化。
在网上阅读 asp.net.
中有关应用程序状态的信息
阅读有关 Session 对象、Cache 对象、Application 对象的信息,也许还有一些有关数据库中数据持久性的信息。
祝你好运。
那是因为此控制器不是特定于页面的,请注意 MVC 行为。
控制器是一对一关系,还是一对多关系取决于您如何使用它。
一对一意味着,一个控制器控制一个页面,执行所需的操作,一旦您将页面留给另一个,就会调用和使用另一个控制器。
一对多,超过一页使用一个控制器(不推荐,这是不好的做法)。
你在这里做的是一对多,意思是每次你想进入一个页面,控制器都会被调用,数据会重置,所有的方法都会重新开始。
您可以在这里尝试做的是:
1) 使用依赖关系来尝试防止数据重置:
2) 扩展控制器行为,因此它不会在每次调用时重置:
我想创建一个非常简单的 Web 服务,它可以为两个数据点随机生成数据,并使该数据可通过 Web 服务访问。我决定尝试使用 ASP.NET Web API。
这是我的 DataGenerator class:
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 class,它实例化了两个 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 class 中生成的数据很好,但它在 ApiController class 中始终显示为 0,我发现这是因为每次从浏览器发出请求时它都会重新实例化。
我该如何解决这个问题?我不明白为什么每次都会调用构造函数。我在网上发现了很多关于依赖注入的东西,但我不明白这是如何解释我的问题的。
我可能遗漏了一些非常明显的东西,因为我是 C# 和 Web 的新手 API。
默认服务行为是无状态的,这意味着 - 是的,它每次都会被实例化。
在网上阅读 asp.net.
中有关应用程序状态的信息
阅读有关 Session 对象、Cache 对象、Application 对象的信息,也许还有一些有关数据库中数据持久性的信息。
祝你好运。
那是因为此控制器不是特定于页面的,请注意 MVC 行为。
控制器是一对一关系,还是一对多关系取决于您如何使用它。
一对一意味着,一个控制器控制一个页面,执行所需的操作,一旦您将页面留给另一个,就会调用和使用另一个控制器。
一对多,超过一页使用一个控制器(不推荐,这是不好的做法)。
你在这里做的是一对多,意思是每次你想进入一个页面,控制器都会被调用,数据会重置,所有的方法都会重新开始。
您可以在这里尝试做的是:
1) 使用依赖关系来尝试防止数据重置:
2) 扩展控制器行为,因此它不会在每次调用时重置: