簡體   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