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日間のデバッグとフラストレーションの後、一部のレコードがこの問題を引き起こし、他のレコードは古いバージョンのコードでは発生しないことがわかりましたが、新しいバージョンではすべてのレコードがこのエラーにつながるため、DB内のデータで何かを行う必要があります。コード内の SOME メソッドは 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 の DB 列の 1 つに、null/不適切な値がありました。この値は、ASP.NET コードの 150 のメソッドの 1 つに反応し、Response.Write() が問題ではなかったにもかかわらず、JavaScript エラーを表示しました。この値に反応したのはどのメソッドかはわかりませんでしたが、列レコードに有効な値を入力するだけの解決策を見つけました..

プログラマーが力ずくで問題を見つける方法:

私の場合、何日もかけてデバッグを行った後、1 つの作業レコードのサンプルと、エラー リード レコードの別のサンプルを取得しました。これを達成したら、使用しました

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;

最初のステートメントが行うことは、非作業レコードを削除し、2 番目のステートメントは、作業レコードの同一の列値を使用してそのレコードを再挿入しますが、非作業レコードの UniqueIdentifier を使用します。このようにして、各テーブルを調べてエラーの原因となっているテーブルを見つけ、そのテーブルのどの列が問題であるかを特定できます。

私の場合の具体的な問題は、テーブル列の値が不適切な形式で挿入されたため、DateTime.TryParse() でした。コードは、DateTime.Parse メソッドを使用して、try と catch を使用せずにメソッドの 1 つでフィールドの入力を実行しました....一部のテストでは、javascript エラーであるため、try/catch でもこのエラーを検出できないようです。

于 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 に答える