首页 新闻 会员 周边

httpruntime.cache 在64位的服务器上面怎么无法跨页获取

0
悬赏园豆:200 [已解决问题] 解决于 2013-07-01 11:33

在本地和32位的服务器上都是可以的,很是郁闷

已经弄了一个月了,还是没搞清楚

请各位大神支支招看看是哪里出了问题,小弟先谢过了

下面是我的缓存类代码

public static class Class1
    {
        private readonly static System.Web.Caching.Cache cache = System.Web.HttpRuntime.Cache;
        /// <summary>
        /// 根据KEY清除缓存
        /// </summary>
        /// <param name="strCacheKey"></param>
        public static void removeCache(string strCacheKey)
        {
            cache.Remove(strCacheKey);
        }
        /// <summary>
        /// 根据KEY获取缓存中的数据
        /// </summary>
        public static object getCache(string strCacheKey)
        {
            return cache.Get(strCacheKey);
        }
        /// <summary>
        /// 保存数据到缓存
        /// </summary>
        public static void setCache(string strCacheKey, object data)
        {
            cache.Insert(strCacheKey, data, null, DateTime.Now.AddDays(1), TimeSpan.Zero);
        }
    }

下面是我说的跨页无法读取的两个页面代码

也贴出来让大家看看那里有问题吧

public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack)
            {
                return;
            }
            if (Class1.getCache("aa") == null)
            {
                Class1.setCache("aa", "page_load");
            }
        }
protected void btn2_Click(object sender, EventArgs e) { object obj = Class1.getCache("aa"); if (obj == null) { ClientScript.RegisterStartupScript(GetType(), "e", "alert('Not Value');", true); } else { ClientScript.RegisterStartupScript(GetType(), "e", string.Format("alert('content:{0}');", obj), true); } } }
public partial class WebForm2 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void btn1_Click(object sender, EventArgs e)
        {
            object obj = Class1.getCache("aa");
            if (obj == null)
            {
                ClientScript.RegisterStartupScript(GetType(), "e", "alert('Not Value');", true);
            }
            else
            {
                ClientScript.RegisterStartupScript(GetType(), "e", string.Format("alert('content:{0}');", obj), true);
            }
        }

        protected void btn2_Click(object sender, EventArgs e)
        {
            Class1.setCache("aa", TextBox1.Text);
        }

        protected void btn3_Click(object sender, EventArgs e)
        {
            Class1.removeCache("aa");
        }
    }

webform2设置的Key:aa value:aa 缓存无法在webform1页面获取 ,在本页可以

还有一个问题,我之前做的缓存无法清除 我怀疑跟上面是一个原因

如下:

HttpRuntime.Cache.Remove("Templtes");//模版缓存
HttpRuntime.Cache.Remove("LableAll");//所有标签缓存

执行完这些代码之后,我读取_LableAll

public static DataTable _LableAll //所有标签缓存
        {
            get
            {
                if (System.Web.HttpRuntime.Cache["LableAll"] == null)
                {
                    System.Web.HttpRuntime.Cache.Insert("LableAll", GetAllLable(), null, DateTime.Now.AddDays(1), TimeSpan.Zero);      //用来存储所有的标签的内容
                }
                return (DataTable)System.Web.HttpRuntime.Cache["LableAll"];
            }
        }

 

还是直接读取的缓存 

GetAllLable()是一个方法,获取所有标签的方法,返回一个DataTable

如果有知道的,麻烦告知一下,被老板骂死了 

就一个清除缓存,做了这么久

我自己也快崩溃了

谢谢。就200豆豆 

alone__的主页 alone__ | 初学一级 | 园豆:60
提问于:2013-06-28 18:09
< >
分享
最佳答案
0

在64位的服务器上,应用程序池是不是设置了Web Garden(相关博文)?

收获园豆:180
dudu | 高人七级 |园豆:30994 | 2013-06-28 18:32

你好,我刚刚看了一下 我们的服务器确实是设置了Web Garden 为27 ,

但是我在32位服务器上面设置了Web Garden为6 也可以跨页访问我设置的缓存的,

alone__ | 园豆:60 (初学一级) | 2013-06-29 15:23

@alone__: HttpRuntime.Cache只在同一个进程中有效,使用Web Garden建议缓存使用Memcached。

dudu | 园豆:30994 (高人七级) | 2013-06-29 15:58

@alone__: HttpRuntime.Cache是服务器端缓存,Memcached是分布式缓存

dudu | 园豆:30994 (高人七级) | 2013-06-30 21:06

@alone__: 不是大材小用

dudu | 园豆:30994 (高人七级) | 2013-07-01 09:02

@alone__:

下载安装Couchbase(http://www.couchbase.com/),然后配置为Memcached服务器;

然后在项目中引用EnyimMemcached(https://github.com/enyim/EnyimMemcached),通过它访问Memcached服务器。

园友子里的相关博文:初用 Couchbase Server

dudu | 园豆:30994 (高人七级) | 2013-07-01 10:46

@alone__: 嗯,安装到服务器,你用的是什么浏览器?

dudu | 园豆:30994 (高人七级) | 2013-07-01 11:21

@alone__: 换Chrome或Firefox试试

dudu | 园豆:30994 (高人七级) | 2013-07-01 11:25

@alone__: 下载时可以选择x64

dudu | 园豆:30994 (高人七级) | 2013-07-01 11:41

@dudu: dudu老大,出问题了, 我下载32位的Couchbase安装在32位的服务器上做测试,安装好了之后index.html页面一直是加载状态

ie下面还报错,现在无法传图 我把消息发给你看看

“行:161

char:1

错误:‘ViewSection’未定义

代码:0

url:http://localhost:8091/index.html”

alone__ | 园豆:60 (初学一级) | 2013-07-02 09:44

@alone__: 服务器上用的是什么浏览器?

dudu | 园豆:30994 (高人七级) | 2013-07-02 10:13

@alone__: 是的,是IE的增强安全机制让js没有加载,安装Firefox。我现在配置新服务器,首先做的就是安装Firefox。

dudu | 园豆:30994 (高人七级) | 2013-07-02 10:36

@dudu: 麻烦你了,我还想问一下 

Available Samples

1 beer-sample  
2 gamesim-sample

这个怎么选 1还是2

alone__ | 园豆:60 (初学一级) | 2013-07-02 10:42

@alone__: 都不选

dudu | 园豆:30994 (高人七级) | 2013-07-02 10:43

@alone__: Administrator

dudu | 园豆:30994 (高人七级) | 2013-07-02 11:12

@alone__: 你找一个支持.NET Framework 2.0的memcached客户端即可

dudu | 园豆:30994 (高人七级) | 2013-07-02 11:42

@dudu: 

public static class CacheHelper
    {
        readonly static object obj = new object();
        readonly static MemcachedClient mc;// 获得客户端实例

        static CacheHelper()
        {
            if (mc==null)
            {
                lock (obj)
                {
                    if (mc==null)
                    {
                        mc = new MemcachedClient();
                        mc.EnableCompression = false;
                        mc.PoolName = Global.MEMCACHED_INSTANCE_NAME;//设置连接池实例名称
                    }
                }
            }
        }

        public static void SetCache(string key,object data)//设置缓存,期限为一天
        {
            mc.Set(key, data, DateTime.Now.AddDays(1)); 
        }

        public static object GetCache(string key)//通过key获取对应的缓存
        {
            if (mc.KeyExists(key))
            {
                return mc.Get(key);
            }
            return null;
        }

        public static void RemoveCache(string key)//删除指定key的缓存
        {
            if (mc.KeyExists(key))
            {
                mc.Delete(key);
            }
        }
    }
alone__ | 园豆:60 (初学一级) | 2013-07-02 17:17

@dudu:dudu老大, 我还有一个问题想问你,

这个Memcached缓存是根据需要缓存的内容大小来申请缓存空间的,

如果缓存内容突然变多了,它是怎么处理的。还能缓存吗。

我缓存的内容是动态改变的,我是直接把Dictionary<string,string>缓存起来的,

开始很小,慢慢的会增加

还有,听说默认设置缓存的内容不能超过1MB,

哪里能设置?

问题有点多,嘿嘿,麻烦您能告诉我吗

alone__ | 园豆:60 (初学一级) | 2013-07-03 10:54

@alone__: 既然是静态类的静态构造函数,if (mc==null) 与 lock (obj) 都是没必要的

dudu | 园豆:30994 (高人七级) | 2013-07-03 10:56

@alone__: 

缓存的内容的确不能超过1MB,我也没找到修改的地方。如果有很多内容超过1M,建议用Couchbase的NoSQL功能(在配置bucket时选择couchbase),而且能持久化。

另外注意的是,缓存的实体的类都要加上[Serializable]标记。

dudu | 园豆:30994 (高人七级) | 2013-07-03 11:00

@alone__: 是静态构造函数是线程安全的,http://stackoverflow.com/questions/7095/is-the-c-sharp-static-constructor-thread-safe

dudu | 园豆:30994 (高人七级) | 2013-07-03 11:17

@alone__: couchbase有专门的客户端,详见http://www.couchbase.com/communities/net/getting-started

dudu | 园豆:30994 (高人七级) | 2013-07-03 11:19

@dudu:dudu老大, 我打算用很多个Dictionary 一一缓存这样效率有保障吗 

alone__ | 园豆:60 (初学一级) | 2013-07-04 10:10

@alone__: 不了解为什么要缓存Dictionary,我们没遇到过这样的场景

dudu | 园豆:30994 (高人七级) | 2013-07-04 10:17

@dudu: 怎么说呢,我存数据的时候key是确定的,取数据也一样,

但是我移除缓存的时候,key是 不确定的

但是可以确定key里面一定包含某个值,

我的key是组合key

alone__ | 园豆:60 (初学一级) | 2013-07-04 10:39

@dudu: 

我举个例子吧,我有一头猪

卖到日本可能是100日币,卖到美国又是70美元(假如)

我现在需要缓存一头猪对应多少日币和多少美元

cache就是“猪+日本”(key)=100(value) and “猪+美国”=70

如果我还养鸭子,那就是“鸭+日本”=50 and “+美国”=20

但是现在猪涨价了,猪对应的缓存需要更新

我需要移除猪的缓存,但我只知道它是猪 我没辙了,

所以我需要把key设为猪,然后猪对应的日币和美元都存到Dictionary里面

dictionary里面  就是“猪+日本”=“100”  and “猪+美国”=“70”

cache里面就是“猪”=Dictionary(猪) “鸭”=dictionary(鸭)

大概就是这样 

能看懂吗

alone__ | 园豆:60 (初学一级) | 2013-07-04 11:03

@alone__: 如果key不确定,说明设计有问题

dudu | 园豆:30994 (高人七级) | 2013-07-04 11:04

@alone__: 不能看懂,相信你自己能解决这个问题

dudu | 园豆:30994 (高人七级) | 2013-07-04 11:05

@dudu: 好吧, 我说的有点多,你也不必懂

现在我还有一个问题,memcachedClient有类似Dictionary遍历所有key的属性keys吗

alone__ | 园豆:60 (初学一级) | 2013-07-04 11:23

@alone__: 没有,你这样的设计是有问题的

dudu | 园豆:30994 (高人七级) | 2013-07-04 11:27

@alone__: Key的不确定

dudu | 园豆:30994 (高人七级) | 2013-07-04 11:33

@dudu: 谢谢,麻烦你了。

我只能先把功能实现在来考虑合不合理的问题了 

要不然,得滚蛋了。

alone__ | 园豆:60 (初学一级) | 2013-07-04 11:59

@dudu: FlushAll是清除全部缓存的方法吗

alone__ | 园豆:60 (初学一级) | 2013-07-04 13:45

@alone__: 这个我没用过

dudu | 园豆:30994 (高人七级) | 2013-07-04 13:45

@dudu: 老大要我直接把缓存数据写入硬盘,

或者为缓存单独写一个服务

总之就是不肯装couchbase server服务端,

这种方法没用了 ,

请问dudu老大有相关方面的资料吗

我现在一头雾水,单独写服务,我勒个去 没写过不会呀,

alone__ | 园豆:60 (初学一级) | 2013-07-04 16:22

@alone__: 可以考虑做成WCF服务

dudu | 园豆:30994 (高人七级) | 2013-07-04 17:11

@dudu: 

谢谢,

http://www.cnblogs.com/zeroone/archive/2012/04/18/2454776.html

你看这篇文章最后一段说的那种可以吗?

跟你说的WCF哪一种比较好

alone__ | 园豆:60 (初学一级) | 2013-07-04 17:42

@alone__: 那种方式我没研究过

dudu | 园豆:30994 (高人七级) | 2013-07-04 17:59

@dudu: dudu老大 WCF支持.netframework2.0吗?

alone__ | 园豆:60 (初学一级) | 2013-07-05 09:33

@alone__: 不支持

dudu | 园豆:30994 (高人七级) | 2013-07-05 09:46

@dudu: 我想问,如果我用。netframe4.0的话,

用wcf做缓存 可以直接用Httpruntime.Cache来存数据吗

alone__ | 园豆:60 (初学一级) | 2013-07-05 09:56

@alone__: 可以

dudu | 园豆:30994 (高人七级) | 2013-07-05 10:21

@dudu:

我在服务端明明只写了一个参数,

为啥在客户端调用的时候多出一个参数来,

bool expiressSpecified(就这个)

alone__ | 园豆:60 (初学一级) | 2013-07-05 10:59

@dudu: 我传object类型,

怎么老报不能生成XML异常

怎么解决啊,

alone__ | 园豆:60 (初学一级) | 2013-07-05 15:38
其他回答(1)
0

楼主,我把你的代码复制到我的本地,测试一点问题都没有,

我的也是64位的系统,

你把你的IIS重新启动一下试试呢,

或是直接把机器重启一下试试,

还有就是请问下你,你的服务器是什么版本的什么系统呢.?

收获园豆:20
只会造轮子 | 园豆:2274 (老鸟四级) | 2013-06-28 18:34

重启没用,重启过很多次了

每次传dll文件到bin目录服务器都重启,而且频繁的时候服务器直接挂了

至于你说的服务器版本,我也不知道诶,

我只有一个ftp能给服务器传文件和下文件 

不过我想很可能是window server 2008

支持(0) 反对(0) alone__ | 园豆:60 (初学一级) | 2013-06-29 15:06

不管怎么样,谢了 

支持(0) 反对(0) alone__ | 园豆:60 (初学一级) | 2013-07-01 11:34
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册