找回密码
 立即注册

QQ登录

只需一步,快速开始

ghostlyt

初级会员

18

主题

76

帖子

214

积分

初级会员

积分
214

活字格认证微信认证勋章

ghostlyt
初级会员   /  发表于:2020-11-19 09:50  /   查看:6773  /  回复:10
本帖最后由 ghostlyt 于 2020-11-19 09:58 编辑

使用版本:C1 2017 v3 日文版
现象:C1Calendar设置AutoPostBack为True,
在频繁点击日期时,会随机出现内存占用异常的情况(IIS内存快速上升至溢出)
系统日志:
Process information:
    Process ID: 12080
    Process name: w3wp.exe
    Account name: A28190221040011\Administrator

Exception information:
    Exception type: OutOfMemoryException
    Exception message: プログラムの実行を続行するための十分なメモリがありませんでした。
   場所 System.Text.StringBuilder.ExpandByABlock(Int32 minBlockCharCount)
   場所 System.Text.StringBuilder.Append(Char value, Int32 repeatCount)
   場所 System.Text.StringBuilder.Append(Char value)
   場所 #lJi.#gMi.#od()
   場所 #lJi.#gMi.#Ly()
   場所 #lJi.#gMi.#X4b()
   場所 #lJi.#gMi.#Ly()
   場所 C1.Web.Wijmo.Controls.JsonHelper.StringToObject(String s)
   場所 C1.Web.Wijmo.Controls.C1Calendar.C1Calendar.#QLi(String #RLi, NameValueCollection #SLi)
   場所 System.Web.UI.Page.ProcessPostData(NameValueCollection postData, Boolean fBeforeLoad)
   場所 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)



Request information:
    Request URL: http://172.16.150.88/uriage/NAW999.aspx
    Request path: /uriage/NAW999.aspx
    User host address: 172.16.150.88
    User:  
    Is authenticated: False
    Authentication Type:  
    Thread account name: A28190221040011\Administrator

Thread information:
    Thread ID: 34
    Thread account name: A28190221040011\Administrator
    Is impersonating: False
    Stack trace:    場所 System.Text.StringBuilder.ExpandByABlock(Int32 minBlockCharCount)
   場所 System.Text.StringBuilder.Append(Char value, Int32 repeatCount)
   場所 System.Text.StringBuilder.Append(Char value)
   場所 #lJi.#gMi.#od()
   場所 #lJi.#gMi.#Ly()
   場所 #lJi.#gMi.#X4b()
   場所 #lJi.#gMi.#Ly()
   場所 C1.Web.Wijmo.Controls.JsonHelper.StringToObject(String s)
   場所 C1.Web.Wijmo.Controls.C1Calendar.C1Calendar.#QLi(String #RLi, NameValueCollection #SLi)
   場所 System.Web.UI.Page.ProcessPostData(NameValueCollection postData, Boolean fBeforeLoad)
   場所 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

请问发生此问题可能的原因以及解决办法?

追加说明:
使用内存分析工具可以看到进程中产生了一个巨大的StringBuilder对象,内容不得而知。
怀疑是上面调用堆栈的System.Text.StringBuilder.Append部分出现了死循环造成内存枯竭。

10 个回复

倒序浏览
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-11-19 11:19:23
沙发
本帖最后由 Richard.Ma 于 2020-11-19 15:24 编辑

我这边暂时未能重现问题, AutoPostBack会触发后台的方法,请确认是否是在后台执行了其他的代码,
如果没有其他代码还是会出现问题的话,可以将能重现问题的项目发我,我来验证问题原因
回复 使用道具 举报
ghostlyt
初级会员   /  发表于:2020-11-20 09:41:27
板凳
我试试看能不能做出可以再现的Demo。
另外:根据上面堆栈的信息测试发现
在调用C1.Web.Wijmo.Controls.JsonHelper.StringToObject(String s)方法时
如果传入的参数s只包含开始单引号或者双引号,就会发生此问题。
例如
JsonHelper.StringToObject("'abc")

但是现在不清楚为什么会产生这种异常数据。

回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-11-20 10:54:14
地板
嗯,等你这边的demo
回复 使用道具 举报
ghostlyt
初级会员   /  发表于:2020-11-23 10:04:03
5#
抱歉,单纯放一个C1Calendar并没能再现该问题。
由于公司规定,项目内代码不能外传,暂时无法提供更具体的资料。

如果我想获取每次页面提交时的数据来确定问题的原因,该怎么着手?
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-11-23 12:14:31
6#
问题原因没法确定。如果是你说的只包含开始单引号或者双引号的话,
JsonHelper.StringToObject(),这里里面的参数应该是一个json字符串,如果是普通字符的话,本身也不能解析出任何内容的。比如你说的“123”,

可以先对数据进行判断,再调用方法试试



回复 使用道具 举报
ghostlyt
初级会员   /  发表于:2020-11-23 14:45:00
7#
目前调查到的情况:
1.项目用到的C1Calendar经过一层封装,为给指定日期设颜色加入了一个很长的js方法。此方法也作为控件的状态保持到了viewstate中(隐藏字段calendar__jsonserverstate_ffcache)
2.在页面PostBack时,有时候提交的隐藏字段内容不完整。正常是一个json字符串,但是由于有一部分丢失,导致变成了这样的数据: {disabled":false, .....  "customizeDate":"xxxxx  }
3.以上面这种json数据传入到JsonHelper.StringToObject进行解析,就会发生内存溢出(双引号不成对)。

回复 使用道具 举报
ghostlyt
初级会员   /  发表于:2020-11-23 15:26:00
8#
本帖最后由 ghostlyt 于 2020-11-23 15:27 编辑

疑问:
假如有下面一个C1Calendar控件:指定了OnClientCustomizeDate="CustomizeDate"

为什么会把CustomizeDate的函数体作为控件本身属性给保持了呢?不应该只保持函数名吗

    <script type="text/javascript">
        function CustomizeDate($daycell, date, dayType, hover, preview) {
           var blnRet = false;
            if ((date.getFullYear() == 2020 && (date.getMonth() + 1) == 11 &&date.getDate() == 11) )
            {
                $daycell.children('a').css('color', 'Blue');
                blnRet = true;
            }
return blnRet;
        }
    </script>

<wijmo:C1Calendar ID="C1Calendar1" runat="server" AutoPostBack="true" Culture="ja-JP" OnClientCustomizeDate="CustomizeDate"></wijmo:C1Calendar>


回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-11-23 15:31:42
9#
好的,这个问题查到了原因就好,可以先看看是否可以解决问题

关于您提出的这个新的问题,我重新建了一个帖子,在新帖讨论吧,我没有太理解你说的把CustomizeDate的函数体作为控件本身属性给保持了,请在新帖中详细说明错误的情况和重现的步骤
https://gcdn.grapecity.com.cn/showtopic-83489-1-1.html
回复 使用道具 举报
ghostlyt
初级会员   /  发表于:2020-11-23 15:48:55
10#
好的,关于此问题,
1. 确认C1Calendar存在固有缺陷,没有考虑此种异常情况。
2. 提交数据不完整是偶然情况下出现,与C1无关。
基于以上两点,这个可以结帖了。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部