[英]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.