Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.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# 为什么Microsoft Web API为每个请求创建新的静态实例?_C#_Asp.net Mvc_Asp.net Web Api - Fatal编程技术网

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

C# 为什么Microsoft Web API为每个请求创建新的静态实例?,c#,asp.net-mvc,asp.net-web-api,C#,Asp.net Mvc,Asp.net Web Api,我正在尝试创建一个singleton对象,它应该在每次调用我的服务器时使用。 但是由于某些原因,每次调用Web API时,静态对象都是保持更新的。 有什么办法阻止它吗?我能做什么 感谢您的回答,以下是一些代码: 单身人士: private static CoreEngine _instance; public static CoreEngine Instance { get { return _instance ?? (_instance = new CoreEngin

我正在尝试创建一个singleton对象,它应该在每次调用我的服务器时使用。 但是由于某些原因,每次调用Web API时,静态对象都是保持更新的。 有什么办法阻止它吗?我能做什么

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

单身人士:

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;
        }
    }
public void Post(字符串uri,字典postDic)
{
使用(var client=new HttpClient())
{
var postUri=FromDictionaryToUriString(uri,postDic);
var response=client.PostAsync(postori,null).Result;
}
}
它只有一个线程和同步。
我尝试了两次重复相同的
POST
方法,第一次我有了
CoreEngine
的第一个实例,而在secound调用中,
CoreEngine
已经被处理,实例被重新创建。

简短的回答是:它应该是这样工作的。长话短说,我试图复制这种奇怪的行为,但没有成功。我的静态变量在多个请求中保持这种方式。在.NET Web Api上应小心使用静态对象,因为它们在应用程序池被回收之前一直保存在内存中。它们也不是线程安全的

有一个更好的地方,比如

HttpContext.Current.Application["myKey"] 
您还可以使用类似于Redis.io的单独进程在该机器上或跨机器维护缓存


请参见

Hmmm。。。我认为那是不可能的。您是否使用没有粘性会话的负载平衡器?第二种猜测是发生进程外异常,导致应用程序池关闭,然后根据应用程序域回收所有静态/缓存/会话数据。如果在不同的应用程序域上处理请求,则将创建一个新的单例对象(因为/如果重复使用worker,则会出现单例已存在于请求上下文中的情况)。web应用程序通常应设计为共享数据,而不是共享单一对象。如何在控制器中初始化_coreEngine?Thomas-
coreEngine\u coreEngine=coreEngine。Instance
假设他正在为一个web应用程序创建多个工作进程,这是正确的。您可以通过打开task manager并查找w3wp.exe以获取更高版本的IIS(我相信是aspnet_wp.exe),了解您是否正在使用多个工作进程。他的问题中没有任何内容告诉我们他正在使用多个服务器或多个工作进程……没有,但是为多个请求生成的单独线程将产生相同的结果。一个不同的单身汉,但事实并非如此。线程位于同一应用程序域上,因此共享
静态
字段。(我确实同意这一点——多个服务器/工作者——是可能的原因。)也许是时候等待@EkoostikMartin的答案并查看一些代码了。