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


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

@karan, яку версію ви використовуєте, а також запит, буде такий "Запит"
PrateekSaluja

125

Зробіть другий аргумент Response помилковим, як показано нижче.

Response.Redirect(url,false);

67

Дозвіл

Щоб вирішити цю проблему, використовуйте один із таких методів:

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

  • Для Response.Redirect використовуйте перевантаження, Response.Redirect (String url, bool 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 внутрішньо.

Статус

Така поведінка є задумом.

Властивості

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 (), і він виконувався в несподіваному місці ( читайте: невідповідне розташування - всередині методу отримання властивості члена ).

Якщо ви налагоджуєте проблему та відчуваєте виняток " Не вдається оцінити вираз ... ":

  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 використовуйте перевантаження, Response.Redirect (String url, bool endResponse), який передає помилку для параметра 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
Ще трохи пояснення того, що робить цей код, було б непогано.
Мерйови


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.