ไม่สามารถประเมินค่านิพจน์ได้เนื่องจากรหัสนั้นได้รับการปรับให้เหมาะสมที่สุดหรือเฟรมดั้งเดิมอยู่ด้านบนของ call stack


143

ฉันได้รับข้อผิดพลาด:

ไม่สามารถประเมินค่านิพจน์ได้เนื่องจากรหัสนั้นได้รับการปรับให้เหมาะสมหรือเฟรมดั้งเดิมอยู่ด้านบนของ call stack

ฉันเปลี่ยนเส้นทางไปยังหน้าใหม่ในเหตุการณ์คำสั่งซื้อของ repeater ข้อผิดพลาดเกิดขึ้นที่บรรทัด:

string url = "~/Galleries/AlbumImageList.aspx?UId=" + this.UserId.ToString() + "&AlbumId=" + e.CommandArgument.ToString();
Response.Redirect(url);

ใครช่วยได้บ้าง มีอะไรผิดปกติหรือเปล่า _COMPlusExceptionCodeเป็น 532459699-

คำตอบ:


162
Request.Redirect(url,false);

false บ่งชี้ว่าการดำเนินการของหน้าปัจจุบันควรจะยุติ


2
มีอะไรเช่น Request.Redirect (url, false) หรือไม่
F11

ไม่มีการเปลี่ยนเส้นทางของคำขอ
karan

@karan เวอร์ชันที่คุณใช้เช่นกันคำขอจะเป็นเช่นนั้น "คำขอ"
PrateekSaluja


67

มติ

เมื่อต้องการแก้ไขปัญหานี้ใช้หนึ่งในวิธีต่อไปนี้:

  • สำหรับResponse.Endให้เรียกใช้ เมธอดHttpContext.Current.ApplicationInstance.CompleteRequest ()แทนResponse.Endเพื่อข้ามการเรียกใช้โค้ดไปยัง เหตุการณ์Application_EndRequest

  • สำหรับResponse.Redirectให้ใช้เกินResponse.Redirect (String URL, บูล endResponse)ที่ผ่านเท็จสำหรับendResponseพารามิเตอร์ในการปราบปรามการโทรภายในResponse.End ตัวอย่างเช่น: Response.Redirect ("nextpage.aspx", false);ถ้าคุณใช้วิธีแก้ปัญหานี้รหัสที่ตามหลัง Response.Redirect จะถูกดำเนินการ

  • สำหรับServer.Transferให้ใช้วิธีServer.Executeแทน

อาการ

ถ้าคุณใช้เมธอด Response.End, Response.Redirect หรือ Server.Transfer จะเกิดข้อยกเว้น ThreadAbortException คุณสามารถใช้คำสั่งลองจับเพื่อตรวจสอบข้อยกเว้นนี้

สาเหตุ

กระบวนการ Response.End วิธีการสิ้นสุดการดำเนินการหน้าและเลื่อนการดำเนินการกับเหตุการณ์ Application_EndRequest ในไปป์ไลน์เหตุการณ์ของโปรแกรม บรรทัดของรหัสที่ตามหลัง Response.End จะไม่ถูกดำเนินการ

ปัญหานี้เกิดขึ้นในวิธีการ Response.Redirect และ Server.Transfer เนื่องจากทั้งสองวิธีเรียกใช้ Response.End ภายใน

สถานะ

พฤติกรรมนี้เกิดจากการออกแบบ

คุณสมบัติ

หมายเลขบทความ (Article ID): 312629 - รีวิวล่าสุด: 30 สิงหาคม 2012 - รุ่น: 4.0

นำไปใช้กับ

  • Microsoft ASP.NET 4.5
  • Microsoft ASP.NET 4
  • Microsoft ASP.NET 3.5
  • Microsoft ASP.NET 2.0
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0

คำสำคัญ: kbexcepthandling kbprb KB312629

แหล่งที่มา: PRB: ThreadAbortException เกิดขึ้นหากคุณใช้ Response.End, Response.Redirect หรือ Server.Transfer


14

ในข้อผิดพลาดฉันกำลังตรวจสอบว่ามี Response.Redirect () และมันกำลังดำเนินการในตำแหน่งที่ไม่คาดคิด ( อ่าน: ตำแหน่งที่ไม่เหมาะสม - ภายในเมธอด getter คุณสมบัติสมาชิก )

หากคุณกำลังดีบักปัญหาและพบกับข้อยกเว้น" ไม่สามารถประเมินค่านิพจน์ ... ":

  1. ทำการค้นหาResponse.Redirect()และทำให้พารามิเตอร์ที่สองendResponse = falseหรือ
  2. ชั่วคราวปิดการใช้งานการโทรเปลี่ยนเส้นทาง

นี่เป็นเรื่องที่น่าหงุดหงิดเนื่องจากดูเหมือนว่าจะทำการเรียกการเปลี่ยนเส้นทางก่อน "ขั้นตอนผ่าน" บนตัวดีบักที่มาถึงตำแหน่งนั้น


13

โปรดตรวจสอบลิงก์นี้เพื่อดูสาเหตุของปัญหานี้และวิธีแก้ไขข้อผิดพลาด:

http://support.microsoft.com/kb/312629/EN-US/

บทความสนับสนุนของ Microsoft:

PRB: ThreadAbortException เกิดขึ้นหากคุณใช้ Response.End, Response.Redirect หรือ Server.Transfer พิมพ์อีเมลพิมพ์

เมื่อต้องการแก้ไขปัญหานี้ใช้วิธีการต่อไปนี้อย่างใดอย่างหนึ่ง: สำหรับ Response.End เรียกการ HttpContext.Current.ApplicationInstance.CompleteRequest วิธีแทนการ Response.End เพื่อข้ามการเรียกใช้รหัสไปยังเหตุการณ์ Application_EndRequest

สำหรับ Response.Redirect ใช้ overload, Response.Redirect (String url, bool endResponse) ที่ส่งค่า false สำหรับพารามิเตอร์ endResponse เพื่อยับยั้งการเรียกภายในไปยัง Response.End

ตัวอย่างเช่น: Response.Redirect ("nextpage.aspx", false);

หากคุณใช้วิธีแก้ปัญหานี้รหัสที่ตามหลัง Response.Redirect จะถูกดำเนินการ สำหรับ Server.Transfer ให้ใช้วิธี Server.Execute แทน


3

ฉันมีปัญหาเดียวกันนี้ด้วยและมันก็ยุ่งยาก สำหรับฉันมันเป็นเพราะฉันใช้ไลบรารี javascript ของ Ext.Js หากคุณกำลังทำ response.redirect ในโค้ดฝั่งเซิร์ฟเวอร์ที่คุณเข้าถึงในการโทร Ajax แสดงว่ามีปัญหา Ext.js มีวิธีแก้ปัญหาด้วยวิธี Ext.Redirect


3

ใช้รหัสนี้แก้ปัญหา:

string path = AppDomain.CurrentDomain.BaseDirectory.ToString() + "Uploadfile\\" + fileName;
System.IO.FileStream fs = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read);
byte[] bt = new byte[fs.Length];
fs.Read(bt, 0, (int)fs.Length);
fs.Close();
Response.ContentType = "application/x-unknown/octet-stream";
Response.AppendHeader("Content-Disposition", "attachment; filename=\"" + fileName;+ "\"");
try
{
    if (bt != null)
    {
        System.IO.MemoryStream stream1 = new System.IO.MemoryStream(bt, true);
        stream1.Write(bt, 0, bt.Length);
        Response.BinaryWrite(bt);
        //Response.OutputStream.Write(bt, 0, (int)stream1.Length);
        Response.Flush();
        // Response.End();
    }
}
catch (Exception ex)
{
    Response.Write(ex.Message);
    throw ex;
}
finally
{
    Response.End();
}

5
คำอธิบายเพิ่มเติมเล็กน้อยเกี่ยวกับสิ่งที่รหัสนี้จะดี
Meryovi


2

เพียงแค่เข้ารหัสให้คนอื่นพบปัญหาที่ฉันทำฉันใช้ Response.End () ปุ่มทริกเกอร์ async

<asp:AsyncPostBackTrigger ControlID="btn_login" />

ในแผงอัปเดต ฉันเปลี่ยนไปใช้โพสต์ปกติไม่ดีที่สุด แต่ใช้งานได้

<asp:PostBackTrigger ControlID="btn_login" />. 

เนื่องจากฉันเพิ่งเปลี่ยนเส้นทางในหน้านี้เป็นทางออกที่ทำงานได้


2

หากคุณใช้ Update Panel และปุ่มลิงค์เพื่อดาวน์โหลด excel อยู่ในแผงควบคุมกว่าเพิ่มทริกเกอร์ postback

<asp:PostBackTrigger ControlID="lnkTemplate" /> 

และใน Code behind เหตุการณ์การคลิก

string ServerPath = System.Configuration.ConfigurationManager.AppSettings["FilePath"] + "Template.xlsx";
System.IO.FileInfo file = new System.IO.FileInfo(Server.MapPath(ServerPath));

HttpContext.Current.Response.Clear();
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name);
HttpContext.Current.Response.AddHeader("Content-Length", file.Length.ToString());
            HttpContext.Current.Response.ContentType = "application/octet-stream";
 HttpContext.Current.Response.TransmitFile(file.FullName);
 HttpContext.Current.Response.Flush();
 HttpContext.Current.ApplicationInstance.CompleteRequest();

1

ใช้สิ่งนี้ได้ผลกับฉันเสมอ

Response.Redirect(Request.RawUrl, false);

ที่นี่ Response.Redirect (Request.RawUrl) เพียงแค่เปลี่ยนเส้นทางไปยัง URL ของบริบทปัจจุบันในขณะที่พารามิเตอร์ที่สอง "เท็จ" หมายถึง endResponse หรือไม่


1
ยินดีต้อนรับสู่ Stackoverflow โปรดอธิบายคำตอบของคุณว่าทำไมมันทำงานอย่างไรมันแก้ปัญหาได้อย่างไรเพื่อให้ผู้อื่นสามารถเข้าใจได้ง่าย
octobus

0

ปัญหานี้อาจเป็นผลเมื่อคุณมีหน้ามีดโกนใน mvc ด้วยรุ่นที่มีกฎการตรวจสอบ เมื่อคุณโพสต์จากแบบฟอร์มและคุณลืมที่จะแสดงข้อผิดพลาดการตรวจสอบในบางสาขาแล้วข้อความนี้อาจเกิดขึ้น การเก็งกำไร: อาจเป็นได้ว่าวิธีการที่คุณโพสต์ไปนั้นแตกต่างกันและใช้โดยแหล่งอื่นหรืออยู่ในสถานที่ที่แตกต่างจากวิธีที่ให้บริการคำขอต้นฉบับ

ดังนั้นเนื่องจากมันแตกต่างกันจึงไม่สามารถกลับไปที่หน้าต้นฉบับเพื่อแสดงหรือจัดการข้อผิดพลาดได้เนื่องจากสถานะ excecution และ model ไม่เหมือนกัน (เช่นนั้น)

อาจเป็นการยากที่จะค้นพบเล็กน้อย แต่ทำผิดพลาดได้ง่าย ตรวจสอบให้แน่ใจว่าวิธีการรับของคุณตรวจสอบวิธีการที่เป็นไปได้ทั้งหมดในการโพสต์

ตัวอย่างเช่นแม้ว่าคุณจะมีการตรวจสอบความถูกต้องของเซิร์ฟเวอร์ที่ทำให้ไม่สามารถเขียนสตริงที่มีขนาดใหญ่กว่าค่าสูงสุดที่อนุญาตให้คุณตรวจสอบได้ แต่อาจมีวิธีและแหล่งข้อมูลอื่นที่โพสต์ไปยังวิธีรับ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.