Tidak dapat mengevaluasi ekspresi karena kode dioptimalkan atau bingkai asli di atas tumpukan panggilan

143

Saya mendapatkan kesalahan:

Tidak dapat mengevaluasi ekspresi karena kode dioptimalkan atau bingkai asli di atas tumpukan panggilan.

Saya telah dialihkan ke halaman baru di acara itemcommand repeater. Kesalahan terjadi pada baris:

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

Adakah yang bisa membantu saya? Apakah ada yang salah di sana? The _COMPlusExceptionCodeadalah - 532459699.

Radhi
sumber

Jawaban:

162
Request.Redirect(url,false);

false menunjukkan apakah eksekusi halaman saat ini harus diakhiri.

PrateekSaluja
sumber
2
Apakah ada yang seperti Request.Redirect (url, false)?
F11
tidak ada properti pengalihan permintaan
karan
@karan versi mana yang Anda gunakan juga akan seperti itu "Permintaan"
PrateekSaluja
125

Buat argumen kedua Response salah seperti yang ditunjukkan di bawah ini.

Response.Redirect(url,false);
Radhi
sumber
67

Resolusi

Untuk mengatasi masalah ini, gunakan salah satu metode berikut:

  • Untuk Response.End , panggil metode HttpContext.Current.ApplicationInstance.CompleteRequest () alih-alih Response.End untuk mem-bypass eksekusi kode ke event Application_EndRequest .

  • Untuk Response.Redirect , gunakan overload, Response.Redirect (String url, bool endResponse) yang melewati false untuk parameter endResponse untuk menekan panggilan internal ke Response.End . Misalnya: Response.Redirect ("nextpage.aspx", false);Jika Anda menggunakan solusi ini, kode yang mengikuti Response.Redirect dijalankan.

  • Untuk Server.Transfer , gunakan metode Server.Execute sebagai gantinya.

Gejala

Jika Anda menggunakan metode Response.End, Response.Redirect, atau Server.Transfer, pengecualian ThreadAbortException terjadi. Anda bisa menggunakan pernyataan coba-tangkap untuk menangkap pengecualian ini.

Sebab

Metode Response.End mengakhiri eksekusi halaman dan menggeser eksekusi ke acara Application_EndRequest di pipeline acara aplikasi. Baris kode yang mengikuti Response.End tidak dieksekusi.

Masalah ini terjadi pada metode Response.Redirect dan Server.Transfer karena kedua metode memanggil Response.End secara internal.

Status

Perilaku ini adalah dengan desain.

Properti

ID Artikel: 312629 - Tinjauan Terakhir: 30 Agustus 2012 - Revisi: 4.0

Berlaku untuk

  • 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

Kata kunci: kbexcepthandling kbprb KB312629

Sumber: PRB: ThreadAbortException Terjadi Jika Anda Menggunakan Response.End, Response.Redirect, atau Server.Transfer

Michel Ayres
sumber
14

Dalam bug yang saya selidiki ada Response.Redirect () dan dieksekusi di lokasi yang tidak terduga ( baca: lokasi yang tidak pantas - di dalam metode pengambil properti anggota ).

Jika Anda men-debug masalah dan mengalami pengecualian " Tidak dapat mengevaluasi ekspresi ... ":

  1. Lakukan pencarian Response.Redirect()dan buat parameter kedua endResponse = false , atau
  2. Nonaktifkan sementara panggilan redirect .

Ini frustasi karena akan muncul untuk mengeksekusi panggilan Redirect sebelum "langkah melalui" pada debugger telah mencapai lokasi itu.

Nick Josevski
sumber
13

Silakan periksa tautan ini untuk alasan di balik masalah ini dan solusi untuk kesalahan:

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

Artikel Dukungan Microsoft:

PRB: ThreadAbortException Terjadi Jika Anda Menggunakan Response.End, Response.Redirect, atau Server.Transfer Cetak Cetak Email Email

Untuk mengatasi masalah ini, gunakan salah satu metode berikut: Untuk Response.End, hubungi HttpContext.Current.ApplicationInstance.CompleteRequest metode alih-alih Response.End untuk memotong eksekusi kode ke acara Application_EndRequest.

Untuk Response.Redirect, gunakan overload, Response.Redirect (String url, bool endResponse) yang melewati false untuk parameter endResponse untuk menekan panggilan internal ke Response.End.

Misalnya: Response.Redirect ("nextpage.aspx", false);

Jika Anda menggunakan solusi ini, kode yang mengikuti Response.Redirect dijalankan. Untuk Server.Transfer, gunakan metode Server.Execute sebagai gantinya.

Mandeep Janjua
sumber
3

Saya punya masalah yang sama juga, dan itu rumit. Bagi saya, itu karena saya menggunakan perpustakaan javascript Ext.Js. Jika Anda melakukan response.redirect dalam kode sisi server yang Anda akses dalam panggilan Ajax , ada masalah. Ext.js memiliki solusi dengan metode Ext.Redirect mereka.

scott
sumber
3

gunakan kode ini untuk menyelesaikan masalah:

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();
}
swathi
sumber
5
Penjelasan lebih sedikit tentang apa yang dilakukan kode ini akan menyenangkan.
Meryovi
3

Anda Juga Bisa Menggunakan Server.Execute

sambit.albus
sumber
2

Hanya membungkus orang lain berlari ke masalah yang saya lakukan saya menggunakan Response.End () tombol pemicu async

<asp:AsyncPostBackTrigger ControlID="btn_login" />

di panel pembaruan. Saya beralih ke pos biasa kembali bukan yang terbaik tetapi berhasil.

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

Karena saya hanya mengarahkan ulang pada halaman ini adalah solusi yang layak.

vikingben
sumber
2

Jika Anda menggunakan Panel Perbarui dan tombol tautan untuk mengunduh excel ada di dalam panel daripada menambahkan pemicu postback

<asp:PostBackTrigger ControlID="lnkTemplate" /> 

dan dalam Kode di balik acara klik di dalam

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();
Mudassir Hasan
sumber
1

Gunakan ini, bekerja untukku selalu.

Response.Redirect(Request.RawUrl, false);

Di sini, Response.Redirect (Request.RawUrl) cukup mengarahkan ke url dari konteks saat ini, sedangkan parameter kedua "false" menunjukkan baik endResponse atau tidak.

Chidi-Nwaneto
sumber
1
Selamat datang di Stackoverflow. Tolong jelaskan jawaban Anda, mengapa ia bekerja bagaimana cara memecahkan masalah, sehingga orang lain dapat mengerti dengan mudah.
octobus
0

Masalah ini mungkin terjadi ketika Anda memiliki halaman silet di mvc dengan model yang memiliki beberapa aturan validasi. Ketika Anda memposting dari formulir dan Anda lupa untuk menampilkan kesalahan validasi pada beberapa bidang, maka pesan ini mungkin muncul. Spekulasi: ini bisa jadi jika metode yang Anda posting berbeda dan digunakan oleh sumber lain atau berada di tempat yang berbeda dari metode yang melayani permintaan awal.

Jadi karena berbeda, tidak dapat kembali ke halaman asli untuk menampilkan atau menangani kesalahan karena status eksekusi dan model tidak sama (sesuatu seperti itu).

Mungkin sedikit sulit ditemukan, tetapi kesalahan mudah dilakukan. Pastikan metode penerima Anda benar-benar memvalidasi semua cara yang mungkin untuk mengirimnya.

misalnya, bahkan jika Anda memiliki validasi sisi server yang sebenarnya membuat mustahil untuk menulis dalam bentuk string yang lebih besar dari maks yang diizinkan oleh validasi Anda, mungkin ada cara dan sumber lain yang memposting ke metode penerima.

Johan Herstad
sumber