调试:Microsoft JScript运行时错误

3

我需要紧急的调试帮助,已经卡在这个错误上六天了......

我在我的ASp.net应用程序中遇到的错误是:

Microsoft JScript runtime error: Sys.WebForms.PageRequestManagerParserErrorException: The message received from the server could not be parsed. Common causes for this error are when the response is modified by calls to Response.Write(), response filters, HttpModules, or server trace is enabled.
Details: Error parsing near '<script type='text/j'.

以下是相关的代码片段,
    CollyDataExchangeWebService Col_ValSub = new CollyDataExchangeWebService();
    CollyReportServiceRequest ServiceReq = new CollyReportServiceRequest();
    CollyReportServiceRequestData ServiceReqData = new CollyReportServiceRequestData();

    ServiceReqData.AmendmentIndicatorSpecified = true;
    ServiceReqData.AmendmentIndicator = false;

    ServiceReqData.CollyReport = ColRep;
    ServiceReq.ServiceRequestData = ServiceReqData;
    ServiceReq.ServiceRequestHeader = ServiceHeader;

    errValidate = null;

    //btnOK.OnClientClick = "MSGShow()";
    bool Valid = true;
    string ErrMsgs = "";

    if (((System.Web.UI.WebControls.Button)(sender)).CommandArgument == "Validate")
    {
        CollyReportServiceResponse ValResponse = Col_ValSub.validateReport(ServiceReq);


        switch (ValResponse.ServiceResponseHeader.ServiceStatus)
        {
            case ServiceStatus.Successful:

                btnOK.OnClientClick = "";
                valHeader.Text = "Validation is Completed. No errors were found";
                mlValPopup.Show();

                break;

            case ServiceStatus.ValidationErrors:
                Valid = false;
                ErrMsgs = ErrMsgs + _ValidationError(ValResponse);
                ValBTN.Update();
                mlValPopup.Show();
                break;

            case ServiceStatus.SystemError:
                btnOK.OnClientClick = "";
                Valid = false;
                ErrMsgs = ErrMsgs + _SystemError(ValResponse);
                ValBTN.Update();
                mlValPopup.Show();
                break;
        }

经过数小时的调试,我发现这行代码导致了错误:

CollyReportServiceResponse ValResponse = Col_ValSub.validateReport(ServiceReq);

经过6天的调试和挫败,我发现在旧版本的代码中,一些记录会导致此问题,而其他记录则不会,但在新版本中,所有记录都会导致此错误,因此它与数据库中的数据有关,这意味着代码中的某些方法对空值的处理方式不同,但我无法确定问题的确切原因,因为我的应用程序有30,000行代码。
在搜索并尝试各种解决方案后,以下两个解决方案都不适用于我的问题。
forums.asp.net/t/1357862.aspx http://www.vbforums.com/showthread.php?t=656246 我想提醒大家,我已经很难处理这个应用程序,因为它是由其他程序员编写的,现在他们已经离开了,留下了没有文档或注释的混乱代码。
我没有编写这个代码,但是过去的其他程序员将Response.Write放入了代码中。
   private void MessageBox(string msg)
    {
        if (!string.IsNullOrEmpty(msg))
        {
            Global.tmpmsg = msg;
            msg = null;
        }
        Response.Write("<script type=\"text/javascript\" language=\"javascript\">");
        Response.Write("window.open('ErrorPage.aspx?msg=" + "','PopUp','screenX=0,screenY=0,width=700,height=340,resizable=1,status=no,scrollbars=yes,toolbars=no');");
        Response.Write("</script>");

    }

这个在另一个方法中:

        Response.Write("<script type=\"text/javascript\" language=\"javascript\">");
        Response.Write("alert('No search resuls were found');");
        Response.Write("</script>"); 

或者这个:
if (!string.IsNullOrEmpty(msg))
{
    Global.tmpmsg = msg;
    Response.Write("<script type=\"text/javascript\" language=\"javascript\">");
    Response.Write("window.open('ErrorPage.aspx?msg=" + "','PopUp','screenX=0,screenY=0,width=700,height=340,resizable=1,status=no,scrollbars=yes,toolbars=no');");
    Response.Write("</script>");
}

在Jrummel的评论后,我将此代码添加到其中,但什么也没有发生。
private void MessageBox(string msg)
{/*
    if (!string.IsNullOrEmpty(msg))
    {
        Global.tmpmsg = msg;
        msg = null;
    }
    Response.Write("<script type=\"text/javascript\" language=\"javascript\">");
    Response.Write("window.open('ErrorPage.aspx?msg=" + "','PopUp','screenX=0,screenY=0,width=700,height=340,resizable=1,status=no,scrollbars=yes,toolbars=no');");
    Response.Write("</script>");
    */
// Define the name and type of the client scripts on the page.
String csname1 = "PopupScript";
Type cstype = this.GetType();

// Get a ClientScriptManager reference from the Page class.
ClientScriptManager cs = Page.ClientScript;

// Check to see if the startup script is already registered.
if (!cs.IsStartupScriptRegistered(cstype, csname1))
{
    String cstext1 = "<script type=\"text/javascript\" language=\"javascript\">" + " " + "window.open('ErrorPage.aspx?msg=" + "','PopUp','screenX=0,screenY=0,width=700,height=340,resizable=1,status=no,scrollbars=yes,toolbars=no');" + " " + "</script>";
  cs.RegisterStartupScript(cstype, csname1, cstext1, false);
}



}

1
我没有看到错误和代码片段之间的关系。<script>标签在哪里? - jrummell
特别是那一行没有显示任何js注册,你的错误与javascript有关。你需要向我们展示更相关的代码。 - Claudio Redi
错误提到了 Response.Write(),你在任何地方使用它了吗? - jrummell
2个回答

2

我在调试了两周并进行了两天的暴力破解后找到了错误:

在我拥有的800个数据库列中,有一个空/不正确的值。这个值与我的ASP.NET代码中的150个方法之一产生了反应,导致出现JavaScript错误,即使Response.Write()不是问题所在。我还没有找到是哪个方法对这个值做出了反应,但我已经找到了解决方案,那就是在列记录中输入有效值。

程序员如何使用暴力破解来查找问题:

在我的情况下,经过长时间的调试,我获取了一个工作记录的样本和一个导致错误的记录的样本。一旦我完成了这个步骤,我就可以使用

DELETE FROM tablename WHERE UniqueColID= unique identifier for the error causing record

然后我做了:

INSERT INTO tablename ([uniqueIdentifier],[ column 2],[column 3]) SELECT @UniqueIdentifierofErrorCausingRecord, column2, [column3] FROM TableName WHERE [uniqueIdentifier]=@UniqueIdentifierForWorkingRecord;

第一条语句的作用是删除不工作的记录,然后第二条语句重新插入该记录,其列值与工作记录相同,但具有非工作记录的唯一标识符。这样,我可以逐个查找每个表格,找出哪个表格导致错误,然后可以确定该表格的哪个列是问题所在。
在我的情况下,特定问题是DateTime.TryParse(),因为一个表格列值以不正确的格式插入。代码在其中一个方法中执行字段填充,使用DateTime.Parse方法而没有try和catch。经过一些测试,似乎即使使用try/catch也无法捕捉到此错误,因为它是javascript错误。

1
不要使用Response.Write()相反,创建一个 LiteralControl 并将其添加到页面中。 使用 ClientScriptManager 将脚本添加到页面。以下是 MSDN 的示例:
// Define the name and type of the client scripts on the page.
String csname1 = "PopupScript";
Type cstype = this.GetType();

// Get a ClientScriptManager reference from the Page class.
ClientScriptManager cs = Page.ClientScript;

// Check to see if the startup script is already registered.
if (!cs.IsStartupScriptRegistered(cstype, csname1))
{
  String cstext1 = "alert('Hello World');";
  cs.RegisterStartupScript(cstype, csname1, cstext1, true);
}

1
如果您查看生成的HTML,可能会看到两组包装脚本的脚本标签以及另一个JavaScript错误。 RegisterStartupScript()中的最后一个参数指示运行时是否将添加周围的<script>标记。因此,您需要将其更改为false,或从脚本字符串中删除脚本标记。 - jrummell
@jrumell 即使我把它改成 false,仍然没有任何反应。 - Bulvak
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/13741/discussion-between-nadal-and-jrummell - Bulvak
逐步执行您的代码,并确保调用了 MessageBox() - jrummell
MessageBox正在被调用,但我不确定为什么会出现这个错误,因为当我用RegisterStartupScript替换它时,我没有收到任何错误提示,但代码根本没有执行任何操作...我希望它能给我更详细的错误信息,或者有一种方法可以告诉我哪里出错了,这样我就可以真正着手修复它...现在我只是毫无头绪。 - Bulvak
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接