3

我迫切需要调试帮助,现在已经被这个错误困住了 6 天.....

我在我的 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 天的调试和挫折后,我发现某些记录会导致此问题,而其他记录不会在旧版本的代码中,但在新版本中,所有记录都会导致此错误,因此它必须对数据库中的数据进行处理,这意味着代码中的某些方法与 null 的行为不同,但我无法确切找出问题所在,因为我的应用程序是 30k 行代码

在搜索并尝试了各种解决方案之后,以下 2 不是我的问题的解决方案。

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);
}



}
4

2 回答 2

2

经过 2 周的调试和 2 天的暴力破解后,我发现了错误:

在我拥有的 800 个数据库列之一中,有一个空值/不正确的值。这个值与我的 ASP.NET 代码中的 150 种方法之一发生反应,即使 Response.Write() 不是问题,也会显示 JavaScript 错误。我还没有找到对这个值做出反应的方法,但我找到了解决方案,即简单地在列记录上输入一个有效值。

程序员如何蛮力找到问题:

在我的情况下,经过长时间的调试,我采集了一个工作记录的样本和另一个错误前导记录的样本。一旦我实现了这一点,我就使用了

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 也无法发现这个错误,因为它是一个 javascript 错误。

于 2012-07-19T14:00:55.047 回答
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);
}
于 2012-07-11T13:09:14.577 回答