Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.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
ASP.NET以编程方式清除在不同服务器上运行的应用程序缓存_Asp.net_Caching - Fatal编程技术网

ASP.NET以编程方式清除在不同服务器上运行的应用程序缓存

ASP.NET以编程方式清除在不同服务器上运行的应用程序缓存,asp.net,caching,Asp.net,Caching,我正在尝试以编程方式从其他服务器清除应用程序的缓存。我见过很多关于在应用程序中清除它的帖子,但不是针对这样的东西。 如果您触摸Web.Config文件,它将回收应用程序池,导致应用程序清除。假设宿主应用程序具有访问权限,我可以通过编程实现这一点。但想知道是否有更好的方法来清除所有缓存项而不重新启动应用程序池。 < P>我会说,当清除整个缓存时,有两个要点需要考虑: 如果您将东西存储在缓存中,希望您有某种同步方法。在这种情况下,删除所有内容可能会导致一些问题(锁定、性能低下、竞争条件) 据我所知,

我正在尝试以编程方式从其他服务器清除应用程序的缓存。我见过很多关于在应用程序中清除它的帖子,但不是针对这样的东西。
如果您触摸
Web.Config
文件,它将回收应用程序池,导致应用程序清除。假设宿主应用程序具有访问权限,我可以通过编程实现这一点。但想知道是否有更好的方法来清除所有缓存项而不重新启动应用程序池。

< P>我会说,当清除整个缓存时,有两个要点需要考虑:

  • 如果您将东西存储在缓存中,希望您有某种同步方法。在这种情况下,删除所有内容可能会导致一些问题(锁定、性能低下、竞争条件)
  • 据我所知,从外部AppDomain访问应用程序的缓存是不可能的(其中一些主要原因是同步和安全问题)
  • 也就是说,如果您想清除缓存中的每个条目(假设您使用的是
    System.Web.Caching
    方法),您可以引入类似以下代码:

    List<string> keys = new List<string>();
    
    IDictionaryEnumerator enumerator = Cache.GetEnumerator();
    
    while (enumerator.MoveNext()){
        keys.Add(enumerator.Key.ToString());
    } // end while
    for (int i = 0; i < keys.Count; i++) {
        Cache.Remove(keys[i]);
    }  // end for loop
    
    List key=new List();
    IDictionaryEnumerator enumerator=Cache.GetEnumerator();
    while(枚举数.MoveNext()){
    Add(enumerator.Key.ToString());
    }//结束时
    对于(int i=0;i
    然后,您可以通过url公开上述代码(例如:
    http://example.com/admin/refresh-cache

    这将允许您以编程方式从另一个应用程序或批处理文件中清除缓存,或者您可以直接从URL访问它

    为了更详细地阐述上面的第一个要点,.NET缓存机制(有多种风格:)都有自己的内置过期功能。如果您发现自己处于要清除整个缓存的位置,这可能表明您应该a)提高缓存保留值,或B)回收应用程序池,因为这将确保应用程序用户的转换更安全。请记住,在应用程序运行时将项目放入缓存的内容在清除所有内容时仍可能尝试这样做



    另一个考虑的选项是使用缓存管理解决方案,如AppFaby().< /P>。您最好的办法是创建一个API,清除缓存中要刷新的应用程序的缓存条目(这样您就可以访问AppDevices),然后从外部调用API。虽然这个问题有点宽泛,不能简明扼要地回答。您正在寻找代码示例吗?是的,代码示例将是理想的。我喜欢你的想法,但这需要创建一个额外的应用程序;他希望有一个更直接的解决方案(即使有一点黑客行为也可以)。但是如果没有其他办法,我会选择你建议的路线。谢谢@xDaevax。这也是我所设想的——拿到所有钥匙并清除它们。但我想需要编写一个服务来实现这一点。有时数据库中会发生一些更改,这些更改需要立即生效。那是我通常清除缓存的时候。理想情况下,我应该找到确切的项目,应该清理的目的,但它的工作确定,以清除所有为我的目的在这一刻。