为什么Microsoft Web API为每个请求创建新的静态实例?

时间:2014-01-24 23:11:45

标签: c# asp.net-mvc asp.net-web-api

我正在尝试创建一个单独的对象,该对象应该用于每次调用我的服务器。 但由于某种原因,每次调用Web API时,静态对象都会保持更新。 有什么方法可以阻止它吗?我该怎么办?

感谢您的回答,以下是一些代码:

The Singleton:

private static CoreEngine _instance;
public static CoreEngine Instance 
    {
        get { return _instance ?? (_instance = new CoreEngine()); }
    }
private CoreEngine(){}

WebAPI方法:

    CoreEngine _coreEngine = CoreEngine.Instance;

    [System.Web.Http.Route("Compare")]
    public void PostCompare([FromUri]string pluginName, [FromUri]string file)
    {
        var plugin = _coreEngine.GetPlugin(pluginName);
        if (plugin == null)
            return;
        plugin.Compare(file);

一个简单的客户:

 public void Post(string uri, Dictionary<string,string> postDic)
    {


        using (var client = new HttpClient())
        {
            var postUri = FromDictionaryToUriString(uri, postDic);

            var response = client.PostAsync(postUri, null).Result;
        }
    }

它只有一个线程和同步。 我尝试重复使用相同的POST方法两次,并且在第一次使用CoreEngine的第一个实例时,在第二次调用中,CoreEngine已被处理,并且实例被重新创造。

2 个答案:

答案 0 :(得分:3)

简短的回答是:这就是应该如何运作的。答案很长already written here.

答案 1 :(得分:0)

我试图复制这种奇怪的行为而不能。我的静态变量在多个请求中保持不变。静态对象应该在.NET Web Api上小心使用,因为它们会在请求中保留在内存中,直到应用程序池被回收。它们也不是线程安全的。

存在更好的地方,例如

HttpContext.Current.Application["myKey"] 

此外,您可以使用与 Redis.io 类似的单独进程来维护该计算机或计算机之间的缓存。

请参阅Synchronizing Data for Multithreading