17

次の例外が発生します。

System.Threading.ThreadAbortException: スレッドが中止されました。
System.Threading.Thread.AbortInternal() で System.Threading.Thread.Abort(Object stateInfo) で System.Web.HttpResponse.End() で System.Web.HttpResponse.Redirect(String url, Boolean endResponse)
で System. Taxi_selection.lnkbtnconfirm_Click の Web.HttpResponse.Redirect(String url) (オブジェクト送信者、EventArgs e)

これに対する解決策は、次を使用することであることがわかりました。

Response.Redirect("home.aspx",false);

しかし、再びこのエラーが発生しています。

これに対する良い解決策は何ですか?

私のコードスニペット:

try
{
    Decimal Amount = 0;
    Int64 CabId = 0;
    String CabName = "";
    String CarImage = "";

    foreach (DataListItem gr in dtlstcars.Items)
    {
        RadioButton objcheck = (RadioButton)gr.FindControl("rdbtncarchecked");
        if (objcheck.Checked == true)
        {
            Literal ltrid = new Literal();
            ltrid = (Literal)gr.FindControl("ltrid");

            Label lbtaxiname = (Label)gr.FindControl("lbtaxiname");
            Label lbonewaycarprice = (Label)gr.FindControl("lbonewaycarprice");
            Label lbtwowaycarprice = (Label)gr.FindControl("lbtwowaycarprice");
            Image imgcar = (Image)gr.FindControl("imgcar");

            if (ltrid != null && lbtaxiname != null && imgcar != null && lbonewaycarprice != null && lbtwowaycarprice != null)
            {
                if (lbrootype.Text == "One")
                {
                    Amount = Convert.ToDecimal(lbonewaycarprice.Text);
                }
                else
                {
                    Amount = Convert.ToDecimal(lbtwowaycarprice.Text);
                }
            }
            CabId = Convert.ToInt64(ltrid.Text);
            CabName = lbtaxiname.Text;
            CarImage = imgcar.ImageUrl;
        }
   }
   if (lbroottype.Text != String.Empty && lbrouteid.Text != String.Empty && lbfrom.Text != String.Empty && lbpickupdate.Text != String.Empty && lbto.Text != String.Empty && lbpickupdate.Text != String.Empty && lbpickuptime.Text != String.Empty)
   { 
        Session.Add("BookingDetail", BookingDetail(lbroottype.Text, Convert.ToInt64(lbrouteid.Text), lbfrom.Text, lbto.Text, Convert.ToDateTime(lbpickupdate.Text), lbpickuptime.Text, Convert.ToDateTime(lbreturndate.Text), String.Empty, CabId, CabName, CarImage, Amount, txtPickupaddress.Text, txtDropaddress.Text, txtlandmark.Text, txtname.Text, ddmobilestdcode.SelectedValue, txtmobileno.Text, ddalternatestdcode.SelectedValue, txtalternateno.Text, txtemail.Text, lbdays.Text));//3
       Session.Remove("cart");
       Session.Remove("editcart");
       Response.Redirect("confirm");
   }
   else
   {
       Response.Redirect("home");
   }
}
catch (Exception ext)
{
    String msg = ext.Message;
    da.InsertRecordWithQuery("insert error_tbl values('" + msg + "')");
}
4

3 に答える 3

30

http://support.microsoft.com/kb/312629

ここでわかるように、問題は、try/catch ブロックで response.redirect を使用しようとしていることです。例外をスローしました。

呼び出しを変更するソリューションは機能するResponse.Redirect(url, false)はずです。すべての Response.Redirect 呼び出しで必ず実行する必要があります。

また、これは実行を継続するため、それを処理する必要があることに注意してください (他の方法で継続しないようにします)。

于 2013-02-01T05:51:18.003 に答える
13

これは、ページの残りの部分を実行し続けない場合にリダイレクトが機能する方法です。スレッドを停止し、その中止例外をスローします。次のように単純に無視できます。

try
{
    Response.Redirect("newpage.aspx", true);
}
catch (System.Threading.ThreadAbortException)
{
    // ignore it
}
catch (Exception x)
{

}

注意

残りの処理を停止せずにリダイレクトを呼び出すと、 NoRedirectのようなプラグインを使用してリダイレクト プロセスを停止できるハックにより、ページの残りの部分が表示される可能性があります。

ここで私の主張を証明するために、次の質問をします。 endResponse を true VS CompleteRequest およびセキュリティ スレッドに指定してページにリダイレクトする

于 2013-02-01T05:50:59.493 に答える
4

Response.RedirectendResponseパラメータを as false(デフォルトは) として指定しないと、内部的trueに呼び出されるため、実行を停止するために a がトリガーされます。Response.End()ThreadAbortException

ここでは、次の 2 つのいずれかをお勧めします。

  1. 応答を終了する必要がある場合は、try/catch で終了しないでください。これにより、リダイレクトが失敗します。

  2. 応答を終了する必要がない場合は、代わりにこれを呼び出します。

    Response.Redirect(url, false);

トライ/キャッチ内:

try {
    // do something that can throw an exception
    Response.Redirect(url, false);
    HttpContext.Current.ApplicationInstance.CompleteRequest();
} catch (SomeSpecificException ex) {
    // Do something with the caught exception
}

ポストバック処理と HTML レンダリングを回避するには、さらに次のことを行う必要があります。

http://web.archive.org/web/20101224113858/http://www.c6software.com/codesolutions/dotnet/threadabortexception.aspx

于 2013-02-01T05:51:00.553 に答える