Невозможно оценить выражение, потому что код оптимизирован или собственный фрейм находится над стеком вызовов.


143

Я получаю ошибку:

Невозможно оценить выражение, потому что код оптимизирован или собственный фрейм находится над стеком вызовов.

Я перенаправил на новую страницу в событии itemcommand повторителя. Ошибка возникает в строке:

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, какую версию вы также используете, запрос будет похож на этот «Запрос»
PrateekSaluja

125

Сделайте второй аргумент Response false, как показано ниже.

Response.Redirect(url,false);

67

разрешение

Чтобы обойти эту проблему, используйте один из следующих методов:

  • Для Response.End вызовите метод HttpContext.Current.ApplicationInstance.CompleteRequest () вместо Response.End, чтобы пропустить выполнение кода для события Application_EndRequest .

  • Для Response.Redirect используйте перегрузку Response.Redirect (String url, bool endResponse), которая передает false для параметра endResponse, чтобы подавить внутренний вызов Response.End . Например: Response.Redirect ("nextpage.aspx", false);если вы используете этот обходной путь, выполняется код, следующий за Response.Redirect.

  • Для Server.Transfer используйте вместо этого метод Server.Execute .

симптомы

Если вы используете метод Response.End, Response.Redirect или Server.Transfer, возникает исключение ThreadAbortException. Вы можете использовать оператор try-catch, чтобы перехватить это исключение.

причина

Метод Response.End завершает выполнение страницы и переносит выполнение в событие Application_EndRequest в конвейере событий приложения. Строка кода, следующая за Response.End, не выполняется.

Эта проблема возникает в методах Response.Redirect и Server.Transfer, поскольку оба метода вызывают Response.End внутри.

Положение дел

Такое поведение является особенностью.

свойства

Номер статьи: 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 (), и он выполнялся в непредвиденном месте ( читай: недопустимое расположение - внутри метода получения свойства элемента ).

Если вы решаете проблему и испытываете исключение « Невозможно оценить выражение ... »:

  1. Выполните поиск Response.Redirect()и либо установите второй параметр endResponse = false , либо
  2. Временно отключите перенаправление вызова .

Это расстраивало, так как казалось, что вызов Redirect выполняется до того, как «шаг через» отладчик достиг этого места.


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 используйте перегрузку Response.Redirect (String url, bool endResponse), которая передает false для параметра endResponse, чтобы подавить внутренний вызов Response.End.

Например: Response.Redirect ("nextpage.aspx", false);

При использовании этого обходного пути выполняется код, следующий за Response.Redirect. Для Server.Transfer используйте вместо этого метод Server.Execute.


3

У меня была такая же проблема, и это было сложно. Для меня это было потому, что я использую библиотеку Ext.Js javascript. Если вы делаете 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
Немного больше объяснения того, что делает этот код, было бы неплохо.
Мерьови


2

Просто, если кто-то столкнулся с проблемами, которые я сделал, я использовал Response.End () кнопку асинхронного запуска

<asp:AsyncPostBackTrigger ControlID="btn_login" />

в панели обновления. Я перешел на обычный пост обратно не самый лучший, но это сработало.

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

Так как я только перенаправлял на страницу, это было жизнеспособное решение.


2

Если вы используете панель обновления и кнопка ссылки для загрузки Excel находится внутри панели, то добавьте триггер обратной передачи

<asp:PostBackTrigger ControlID="lnkTemplate" /> 

и в коде позади события щелчка

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 текущего контекста, тогда как второй параметр «false» указывает либо на endResponse, либо нет.


1
Добро пожаловать в Stackoverflow. Пожалуйста, объясните свой ответ, почему это работает, как это решает проблему, чтобы другие могли легко понять.
Октябрь

0

Эта проблема может быть результатом, если у вас есть страница бритвы в mvc с моделью, которая имеет некоторые правила проверки. Когда вы отправляете сообщение из формы и забываете отображать ошибки проверки в каком-либо поле, это сообщение может появиться. Предположение: это может быть, если метод, на который вы отправляете сообщение, отличается и используется другими источниками или находится в другом месте, чем метод, обслуживающий исходный запрос.

Так как он отличается, он не может вернуться на исходную страницу для отображения или обработки ошибок, потому что состояние исключения и модели не совпадают (что-то подобное).

Это может быть немного трудно обнаружить, но легко сделать ошибку. Убедитесь, что ваш метод получения действительно проверяет все возможные способы публикации в нем.

например, даже если у вас есть проверка на стороне сервера, которая фактически делает невозможным запись в форме строки, превышающей максимально допустимый для вашей проверки, могут существовать другие способы и источники, которые публикуются в методе получения.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.