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

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

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

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

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

Кто-нибудь может мне помочь? Там что-то не так? _COMPlusExceptionCode - это 532459699.

Ответы [ 10 ]

159 голосов
/ 01 октября 2010
Request.Redirect(url,false);

false указывает, следует ли прекратить выполнение текущей страницы.

121 голосов
/ 11 января 2010

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

Response.Redirect(url,false);
66 голосов
/ 07 августа 2013

Разрешение

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

  • Для 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 голосов
/ 11 февраля 2010

В баге, который я исследовал, был Response.Redirect (), и он выполнялся в неожиданном местоположении ( прочитано: недопустимое местоположение - внутри метода получения свойства элемента ) .

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

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

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

13 голосов
/ 15 февраля 2012

Пожалуйста, проверьте эту ссылку для причины этой проблемы и решения для ошибки:

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

Статья службы поддержки Microsoft:

PRB: ThreadAbortException возникает, если вы используете Response.End, Response.Redirect или Server.Transfer Распечатать Распечатать Электронная почта

Чтобы обойти эту проблему, используйте один из следующих методов: Ответ. Позвоните Вместо этого используется метод HttpContext.Current.ApplicationInstance.CompleteRequest Response.End, чтобы обойти выполнение кода к Событие Application_EndRequest.

Для Response.Redirect используйте перегрузку, Response.Redirect (String url, bool endResponse) что ложно для параметр endResponse для подавления внутреннего вызова Response.End.

Например: Response.Redirect ("nextpage.aspx", ложь);

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

3 голосов
/ 08 октября 2013

используйте этот код для решения проблемы:

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();
}
3 голосов
/ 02 мая 2012

Также вы можете использовать Server.Execute

3 голосов
/ 02 сентября 2010

У меня тоже была такая же проблема, и это было сложно. Для меня это было потому, что я использую библиотеку Ext.Js javascript. Если вы делаете response.redirect в коде на стороне сервера, к которому вы обратились при вызове Ajax , возникнут проблемы. У Ext.js есть обходной путь с их методом Ext.Redirect.

2 голосов
/ 17 августа 2016

Если вы используете панель обновления и кнопка ссылки для загрузки 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();
2 голосов
/ 17 декабря 2013

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

<asp:AsyncPostBackTrigger ControlID="btn_login" />

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

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

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

...