【问题标题】:Why does Microsoft Web API create new static instance for each request?为什么 Microsoft Web API 会为每个请求创建新的静态实例?
【发布时间】:2014-01-24 23:11:44
【问题描述】:

我正在尝试创建一个单例对象,每次调用我的服务器时都应该使用该对象。 但由于某种原因,静态对象会在每次调用 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;
        }
    }

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

【问题讨论】:

  • 嗯...我不认为这是可能的。您是否使用没有粘性会话的负载均衡器?第二个猜测是正在发生进程外异常,导致您的应用程序池关闭,然后回收所有静态/缓存/会话数据
  • static每个应用程序域。如果在不同的应用程序域上处理请求,则将创建一个新的单例对象(因为/如果重新使用工作人员,则请求上下文中已经存在单例)。 Web 应用程序通常应设计为共享 数据 而不是共享的单例对象。
  • 如何在控制器中初始化_coreEngine?
  • 托马斯-CoreEngine _coreEngine = CoreEngine.Instance

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


【解决方案1】:

简短的回答是:它应该是这样工作的。长答案是already written here.

【讨论】:

  • 这是真的,假设他正在为一个 Web 应用程序创建多个工作进程。您可以通过调出任务管理器并为更高版本的 IIS 查找 w3wp.exe(我相信是 aspnet_wp.exe)来了解您是否正在使用多个工作进程
  • 他的问题中没有任何内容告诉我们他正在使用多个服务器或多个工作进程......
  • 否,但是为多个请求生成的单独线程将产生相同的结果。一个不同的单身人士。
  • @DigitalD 不是这样。线程在同一个应用程序域上,因此共享static 字段。 (我确实同意这 - 多个服务器/工作人员 - 是可能的原因。)
  • 也许是时候等待@EkoostikMartin 的答复并查看一些代码了。
【解决方案2】:

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

存在更好的地方,例如

HttpContext.Current.Application["myKey"] 

您还可以使用类似于 Redis.io 的单独进程来维护该机器上或跨机器的缓存。

Synchronizing Data for Multithreading

【讨论】:

    猜你喜欢
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2021-09-13
    • 2021-06-15
    • 1970-01-01
    • 2016-08-07
    • 2011-05-15
    相关资源
    最近更新 更多