Không thể đánh giá biểu thức vì mã được tối ưu hóa hoặc khung gốc nằm trên đầu ngăn xếp cuộc gọi


143

Tôi nhận được lỗi:

Không thể đánh giá biểu thức vì mã được tối ưu hóa hoặc khung gốc nằm trên đầu ngăn xếp cuộc gọi.

Tôi đã chuyển hướng đến một trang mới trong sự kiện itemcommand của repeater. Lỗi xảy ra tại dòng:

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

Ai có thể vui lòng giúp tôi? Có gì sai ở đó? Đây _COMPlusExceptionCodelà - 532459699.

Câu trả lời:


162
Request.Redirect(url,false);

false cho biết liệu thực hiện của trang hiện tại nên chấm dứt.


2
Có bất cứ điều gì như Request.Redirect (url, false) không?
F11

không có tài sản chuyển hướng của yêu cầu
karan

@karan phiên bản bạn đang sử dụng cũng yêu cầu sẽ giống như "Yêu cầu"
PrateekSaluja

125

Đưa ra đối số thứ hai của Response sai như hiển thị bên dưới.

Response.Redirect(url,false);

67

Nghị quyết

Để khắc phục sự cố này, sử dụng một trong các phương pháp sau:

  • Đối với Feedback.End , hãy gọi phương thức HttpContext.Cản.ApplicationInstance.CompleteRequest () thay vì Feedback.End để bỏ qua việc thực thi mã đến sự kiện Application_EndRequest .

  • Đối với Response.Redirect , sử dụng một quá tải, Response.Redirect (String url, bool endResponse) mà đi sai cho endResponse tham số để ngăn chặn các cuộc gọi nội bộ để Response.End . Ví dụ: Response.Redirect ("nextpage.aspx", false);Nếu bạn sử dụng cách giải quyết này, mã theo sau Feedback.Redirect được thực thi.

  • Đối với Server.Transfer , thay vào đó , hãy sử dụng phương thức Server.Execute .

Triệu chứng

Nếu bạn sử dụng phương thức Feedback.End, Feedback.Redirect hoặc Server.Transfer, sẽ xảy ra ngoại lệ ThreadAdortException. Bạn có thể sử dụng câu lệnh try-Catch để bắt ngoại lệ này.

Nguyên nhân

Phương thức Feedback.End kết thúc thực thi trang và chuyển việc thực thi sang sự kiện Application_EndRequest trong đường ống sự kiện của ứng dụng. Dòng mã theo sau Feedback.End không được thực thi.

Sự cố này xảy ra trong các phương thức Feedback.Redirect và Server.Transfer vì cả hai phương thức đều gọi Feedback.End bên trong.

Trạng thái

Hành vi này là do thiết kế.

Tính chất

ID bài viết: 312629 - Đánh giá lần cuối: ngày 30 tháng 8 năm 2012 - Sửa đổi: 4.0

Áp dụng cho

  • 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

Từ khóa: kbexemthandling kbprb KB312629

Nguồn: PRB: ThreadAdortException Xảy ra nếu bạn sử dụng Phản hồi .End, Feedback.Redirect hoặc Server.Transfer


14

Trong một lỗi tôi đang điều tra có một Phản hồi.Redirect () và nó đang thực thi ở một vị trí không mong muốn ( đọc: vị trí không phù hợp - bên trong phương thức getter thuộc tính thành viên ).

Nếu bạn đang gỡ lỗi một vấn đề và gặp phải ngoại lệ " Không thể đánh giá biểu thức ... ":

  1. Thực hiện tìm kiếm Response.Redirect()và tạo tham số thứ hai endResponse = false hoặc
  2. Tạm thời vô hiệu hóa cuộc gọi chuyển hướng .

Điều này thật khó chịu vì nó sẽ xuất hiện để thực hiện cuộc gọi Redirect trước khi "bước qua" trên trình gỡ lỗi đã đến vị trí đó.


13

Vui lòng kiểm tra liên kết này để biết lý do đằng sau vấn đề này và giải pháp cho lỗi:

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

Điều hỗ trợ của Microsoft:

PRB: ThreadAdortException Xảy ra nếu bạn sử dụng Phản hồi .End, Feedback.Redirect hoặc Server.Transfer In In Email Email

Để khắc phục sự cố này, hãy sử dụng một trong các phương pháp sau: Đối với Phản hồi.End, hãy gọi phương thức HttpContext.Cản.ApplicationInstance.CompleteRequest thay vì Feedback.End để bỏ qua việc thực thi mã đến sự kiện Application_EndRequest.

Đối với Feedback.Redirect, hãy sử dụng quá tải, Feedback.Redirect (Chuỗi url, bool endResponse) chuyển sai cho tham số endResponse để chặn cuộc gọi nội bộ sang Feedback.End.

Ví dụ: Feedback.Redirect ("nextpage.aspx", false);

Nếu bạn sử dụng cách giải quyết này, mã theo sau Feedback.Redirect sẽ được thực thi. Đối với Server.Transfer, thay vào đó, hãy sử dụng phương thức Server.Execute.


3

Tôi cũng có vấn đề tương tự, và nó thật khó khăn. Đối với tôi, đó là vì tôi đang sử dụng thư viện javascript của Ext.Js. Nếu bạn đang thực hiện một answer.redirect trong mã phía máy chủ mà bạn đã truy cập trong một cuộc gọi Ajax , có vấn đề. Ext.js có một cách giải quyết với phương thức Ext.Redirect của họ.


3

sử dụng mã này giải quyết vấn đề:

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
Giải thích thêm một chút về những gì mã này sẽ làm tốt.
Meryovi


2

Chỉ cần xử lý người khác gặp phải các vấn đề tôi đã sử dụng Phản hồi .End () nút kích hoạt không đồng bộ

<asp:AsyncPostBackTrigger ControlID="btn_login" />

trong một bảng cập nhật. Tôi chuyển sang bài viết thường xuyên trở lại không phải là tốt nhất nhưng nó đã làm việc.

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

Vì tôi chỉ chuyển hướng trên trang nên đây là một giải pháp khả thi.


2

Nếu bạn đang sử dụng Bảng cập nhật và nút liên kết để tải xuống excel nằm trong bảng điều khiển hơn là thêm trình kích hoạt gửi lại

<asp:PostBackTrigger ControlID="lnkTemplate" /> 

và trong Mã phía sau sự kiện nhấp chuột bên trong

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

Sử dụng cái này, làm việc cho tôi luôn.

Response.Redirect(Request.RawUrl, false);

Ở đây, Feedback.Redirect (Request.RawUrl) chỉ cần chuyển hướng đến url của bối cảnh hiện tại, trong khi tham số thứ hai "false" chỉ ra endResponse hoặc không.


1
Chào mừng bạn đến với Stackoverflow. Hãy giải thích câu trả lời của bạn, tại sao nó hoạt động như thế nào để giải quyết vấn đề, để những người khác có thể hiểu dễ dàng.
octobus

0

Vấn đề này có thể là kết quả khi bạn có một trang dao cạo trong mvc với một mô hình có một số quy tắc xác thực. Khi bạn đăng từ một biểu mẫu và bạn quên hiển thị lỗi xác thực trên một số trường, thì thông báo này có thể xuất hiện. Suy đoán: điều này có thể là nếu phương thức bạn đang đăng lên khác và được sử dụng bởi các nguồn khác hoặc nằm ở một nơi khác với phương thức phục vụ yêu cầu ban đầu.

Vì vậy, vì nó khác nhau, nó không thể quay lại trang gốc để hiển thị hoặc xử lý các lỗi vì trạng thái mô hình và trạng thái không giống nhau (đại loại như vậy).

Nó có thể hơi khó để khám phá, nhưng dễ mắc lỗi. Hãy chắc chắn rằng phương pháp nhận của bạn thực sự xác nhận tất cả các cách có thể để đăng lên nó.

chẳng hạn, ngay cả khi bạn có xác thực bên máy chủ mà thực sự không thể viết dưới dạng một chuỗi lớn hơn mức tối đa cho phép của xác thực của bạn, có thể có các cách và nguồn khác đăng lên phương thức nhận.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.