C# aspx网页很奇怪的反应,求大神解决

shoppo0505 2018-02-14 12:10:51
做了一个网站,C# aspx做的。
在网页中,最上面是一些dropdownlist,后台定义了时间,有个Grid,点击grid上面的修改按钮,会载入其他一些数据。

现在的情况是,当刚打开页面的时候,dropdownlist的选取值变化的时候,后台事件触发。但是,当我打开grid之后,载入了很多信息,这个时候dropdownlist不会被触发了。
这个架构用在了很多页面上,但是只有一个页面出现这个问题,其他都没有问题。

我查看了下,打开这个网页的时候,内存暴涨到了200MB,其他都在100MB出头,不知道是不是这个原因?IIS难道有内存限制?
因为这个页面之前做完之后,测试过,没有问题,只有就一直没有动过,开发了一些其他功能。但是现在不行了,所以很奇怪。

求高手解答。
...全文
1474 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 35 楼 xomix 的回复:
我不知道他是不是跟我情况一样,我们这边强制要求不许使用cookie,然后所有用户缓存都存session…………
缓存框架叫做 Cache,而不是 Session。
  • 打赏
  • 举报
回复
Session 集合中的东西会丢失,这个不假,但是这并不是说 Session 就是专门做缓存的。要按照正规的缓存的理论知识和机制来使用 Cache,而不是 Session。 另外这个帖子的问题显然跟 Session 并没有直接关系,纯粹是因为删除了代码,恰好也就把垃圾数据和代码(错误的绑定代码)删除了而暂时不能重现问题了。但是实际上这种问题早已经暴露出来、明眼人已经意识到程序设计者后续的知识结构会有问题。
  • 打赏
  • 举报
回复
引用 34 楼 hanjun0612 的回复:
[quote=引用 33 楼 shoppo0505 的回复:] 内存暴涨 确实因为session里存储了数据。 但是load数据到session的之前会判断session的当前状态,所以,不会不会被加载多次。 你最后两句就不回答了。
我倒是挺好奇的。你说的判断session当前状态是怎么个判断法。 两个用户登录后,你确保了只有一个session被加载了? 换言之,就是说session数据被多个用户共享了吗?如果说你使用cookie来存储了sessionid,然后通过sessionid去查找的,那么也还能说得通。 如果你只是单纯的session["data"]!=null这种判断,那么根本没有用。 而针对你问题的解决方案也已经给出了,是使用缓存,而不是减少session这种治标不治本的方案。[/quote] 我不知道他是不是跟我情况一样,我们这边强制要求不许使用cookie,然后所有用户缓存都存session…………
正怒月神 2018-02-22
  • 打赏
  • 举报
回复
引用 33 楼 shoppo0505 的回复:
内存暴涨 确实因为session里存储了数据。 但是load数据到session的之前会判断session的当前状态,所以,不会不会被加载多次。 你最后两句就不回答了。
我倒是挺好奇的。你说的判断session当前状态是怎么个判断法。 两个用户登录后,你确保了只有一个session被加载了? 换言之,就是说session数据被多个用户共享了吗?如果说你使用cookie来存储了sessionid,然后通过sessionid去查找的,那么也还能说得通。 如果你只是单纯的session["data"]!=null这种判断,那么根本没有用。 而针对你问题的解决方案也已经给出了,是使用缓存,而不是减少session这种治标不治本的方案。
shoppo0505 2018-02-22
  • 打赏
  • 举报
回复
引用 32 楼 hanjun0612 的回复:
[quote=引用 14 楼 shoppo0505 的回复:] 现在问题解决了,解决方法是我减少了session的数量,比较少用的数据会实时从数据库加载,而不是采用session保存的方式。 所以你这个问题我就不回答了。
这是一个致命并且错误的理解啊。 在web基础上,你的理解就出现问题了。 你需要保存数据,应该放在服务器的本地缓存,可以是cache,可以是redis或者 memorycache。反正注入此类的缓存工具不要太多。 你内存暴涨的由来,就是因为你存储在了session里。 每个用户登录,使用不同的session,因为他们具有的 sessionid是不一样的。 因此你的同一份数据,被分别多个用户加载了N次。而这些session根本没有起到数据共享的作用。 最多也就是当前用户不用多次读取数据罢了。 [/quote] 内存暴涨 确实因为session里存储了数据。 但是load数据到session的之前会判断session的当前状态,所以,不会不会被加载多次。 你最后两句就不回答了。
正怒月神 2018-02-22
  • 打赏
  • 举报
回复
引用 14 楼 shoppo0505 的回复:
现在问题解决了,解决方法是我减少了session的数量,比较少用的数据会实时从数据库加载,而不是采用session保存的方式。 所以你这个问题我就不回答了。
这是一个致命并且错误的理解啊。 在web基础上,你的理解就出现问题了。 你需要保存数据,应该放在服务器的本地缓存,可以是cache,可以是redis或者 memorycache。反正注入此类的缓存工具不要太多。 你内存暴涨的由来,就是因为你存储在了session里。 每个用户登录,使用不同的session,因为他们具有的 sessionid是不一样的。 因此你的同一份数据,被分别多个用户加载了N次。而这些session根本没有起到数据共享的作用。 最多也就是当前用户不用多次读取数据罢了。
shoppo0505 2018-02-22
  • 打赏
  • 举报
回复
引用 27 楼 xuzuning 的回复:
我没有无中生有的本事,要知道代码在什么方面会有问题,总是先要看到代码的 SelectedIndexChanged 要在 cmb 的的值发生变化时才会被触发 session 是私有的缓存机制,如果你要在两次 SelectedIndexChanged 之间缓存查询数据,显然是不妥当的
等我有空弄个demo吧。
正怒月神 2018-02-22
  • 打赏
  • 举报
回复
引用 35 楼 xomix 的回复:
我不知道他是不是跟我情况一样,我们这边强制要求不许使用cookie,然后所有用户缓存都存session…………
不适用cookie的话,记录用户账户和密码,你们是写在文本里吗? 因为就算使用令牌也要存储cookie吧。 况且我认为session存储数据是不合理的。你们的项目架构没有cache之类的缓存层吗?
  • 打赏
  • 举报
回复
asp.net 机制自动通过 ViewState 来自动化地充填和重新产生控件内容,你可以想象一下“滥用Session能干什么?”,肯定就是用来一遍遍重新绑定控件用的。那么删除了这些代码,貌似不会重现问题了。但是问题依然存在,因为还没有学会 asp.net 编程机制。
秋的红果实 2018-02-19
  • 打赏
  • 举报
回复
引用 14 楼 shoppo0505 的回复:
[quote=引用 13 楼 From_TaiWan 的回复:] 我的知觉告诉我,你control加载数据有问题,会不会是递归加载,或者陷入死循环,或者反复加载... 请贴出control加载数据的代码 dropdownlist事件不可能有时候触发,有时候不行,估计是在等待数据加载完成,而这个加载一直在进行
现在问题解决了,解决方法是我减少了session的数量,比较少用的数据会实时从数据库加载,而不是采用session保存的方式。 所以你这个问题我就不回答了。[/quote]解决了问题,就结帖吧 当初没见到你的源码,不知道是session问题。 session尽量少用
春天的气息 2018-02-18
  • 打赏
  • 举报
回复
有了无限循环的吧,呵呵
xuzuning 2018-02-18
  • 打赏
  • 举报
回复
我没有无中生有的本事,要知道代码在什么方面会有问题,总是先要看到代码的 SelectedIndexChanged 要在 cmb 的的值发生变化时才会被触发 session 是私有的缓存机制,如果你要在两次 SelectedIndexChanged 之间缓存查询数据,显然是不妥当的
shoppo0505 2018-02-17
  • 打赏
  • 举报
回复
引用 22 楼 sp1234 的回复:
你可以在类似代码
this.cmb.DataBind();
这类地方设置一个 vs 调试器断点,然后使用 Button 测试来测试,当你点击测试 Button 的时候,绝不可能执行 DataBind() 这类代码。因为 asp.net 服务器控件是自动使用 ViewState 保存所有状态数据、并且自动重建整个深层次控件的。如果你自己的 DataBind() 了那岂不是画蛇添足、不但造成巨大的性能问题而且也破坏了原来的控件了嘛!
问题1:数据源设置是在page_load里面的。 问题2:我不知道你再说什么,请别别人总是和你类比,给点有建设性的意见。 问题3:我说过了,后台代码所有事件位置都设置了代码了,包括page_load,都进不去。减少session是指减少了少调用的session,对于这些控件,删除的session使用实时调用的方式。这些删除的session并非垃圾代码,而是使用时间换取性能。 你还有什么问题?
shoppo0505 2018-02-17
  • 打赏
  • 举报
回复
... ... 问题3:我说过了,后台代码所有事件位置都设置了断点了...
  • 打赏
  • 举报
回复
所谓“加载详细数据之后”,这里需要你自己设置中断调试、测试来验证当回发时绝不允许做不该做的事情,你调试、测试了吗?所谓“减少session之后”也不过是删除了垃圾代码,而你不做测试、调试那么你也就不知道自己删除的哪行代码才是垃圾代码。 真正会开发的人绝不可能靠照抄一些“常识”而开发,而是他自己懂得了设计测试用例来挖掘内部机制的常识。但愿你真的理解常识背后的逻辑。
  • 打赏
  • 举报
回复
你说的“常识”是从你接受灌输的角度来说的,你说多少遍其实也都等于没有识别什么是常识。只有自己贴出了测试的人,才真的懂常识。如果你的常识就是指抄过一些笔记而已,那么你说的这个“常识”其实不是我们心目中的常识,因为你根本没有学进去。
  • 打赏
  • 举报
回复
你可以在类似代码
this.cmb.DataBind();
这类地方设置一个 vs 调试器断点,然后使用 Button 测试来测试,当你点击测试 Button 的时候,绝不可能执行 DataBind() 这类代码。因为 asp.net 服务器控件是自动使用 ViewState 保存所有状态数据、并且自动重建整个深层次控件的。如果你自己的 DataBind() 了那岂不是画蛇添足、不但造成巨大的性能问题而且也破坏了原来的控件了嘛!
shoppo0505 2018-02-17
  • 打赏
  • 举报
回复
引用 20 楼 xuzuning 的回复:
诸如减少数据缓存之类的鸵鸟战术,虽然往往是有效的,但是治标不治本 如果你坚持是你的代码没有问题,那么我只能说你的整体逻辑出问题了
那你觉得代码在什么方面会有问题?能举个实例么? 我对于我这里发生典型的错误举个实例,这里是一段代码: <telerik:RadComboBox ID="cmb" runat="server" AutoPostBack="true" OnSelectedIndexChanged="cmb_SelectedIndexChanged"></telerik:RadComboBox> 后台的代码: 数据源绑定: this.cmb.DataSource = datasource; this.cmb.DataTextField = "Description"; this.cmb.DataValueField = "Id"; this.cmb.DataBind(); 后台事件定义: protected void cmb_SelectedIndexChanged(object sender, RadComboBoxSelectedIndexChangedEventArgs e) { ...... } 现在在网页首次打开,未载入详细数据的时候,控件有效事件触发。加载详细数据之后,控件后台事件不能触发。 减少session之后(这些session和这个控件没有直接联系),控件无论在什么时候都能用了。 请高手你指点一下,这个到底是什么问题?代码应该怎么改动。至于什么page_load中要判定Ispostback什么的,我就不说了,这个都是常识。
xuzuning 2018-02-16
  • 打赏
  • 举报
回复
诸如减少数据缓存之类的鸵鸟战术,虽然往往是有效的,但是治标不治本 如果你坚持是你的代码没有问题,那么我只能说你的整体逻辑出问题了
shoppo0505 2018-02-16
  • 打赏
  • 举报
回复
引用 15 楼 caozhy 的回复:
https://www.cnblogs.com/xiaoma-qi/p/5508407.html
不是这个问题。 我只是删除了一些无关于这个控件的session,减少了内存的时候,问题就解决了。所有有关这个控件的代码,我都没有修改。 所以你这个帖子的情况不能解决我的问题。而且我的代码本身就是这么做的。
加载更多回复(18)

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧