Saya mencoba mengonversi dataset saya menjadi excel dan mengunduh excel itu. Saya mendapatkan file excel yang saya butuhkan. Tetapi System.Threading.ThreadAbortException dinaikkan setiap unduhan excel. Bagaimana cara mengatasi masalah ini? .. Tolong bantu saya ...
Saya memanggil metode ini di layar aspx saya. Ada juga pengecualian yang sama telah dilemparkan oleh metode ini.
Saya menyebut bahwa fungsi ExportDataSet (DataSet ds) public void di banyak layar aspx dan juga saya mempertahankan metode error logger untuk pengecualian yang dimunculkan pada saat runtime, pengecualian tersebut ditulis ke dalam file .txt. Jadi pengecualian yang sama dicatat di semua file txt layar aspx. Saya hanya ingin menghindari pengecualian ini melempar dari metode file kelas yang dideklarasikan ke aspx. Cukup saya hanya ingin menangani pengecualian ini di file kelas deklarasi metode saya itu sendiri.
Metode File ASPX panggilan: excel.ExportDataSet (dsExcel);
Definisi Metode:
public void ExportDataSet(DataSet ds)
{
try
{
string filename = "ExcelFile.xls";
HttpResponse response = HttpContext.Current.Response;
response.Clear();
response.Charset = "";
response.ContentType = "application/vnd.ms-excel";
response.AddHeader("Content-Disposition", "attachment;filename=\"" + filename + "\"");
using (StringWriter sw = new StringWriter())
{
using (HtmlTextWriter htw = new HtmlTextWriter(sw))
{
GridView dg = new GridView();
dg.DataSource = ds.Tables[0];
dg.DataBind();
dg.RenderControl(htw);
// response.Write(style);
response.Write(sw.ToString());
response.End(); // Exception was Raised at here
}
}
}
catch (Exception ex)
{
string Err = ex.Message.ToString();
EsHelper.EsADLogger("HOQCMgmt.aspx ibtnExcelAll_Click()", ex.Message.ToString());
}
finally
{
}
}
Response.End
lihat stackoverflow.com/a/3917180/2864740 (dan jawaban lainnya); perhatikan bahwa pengecualiannya adalah "diharapkan" karena begitulah cara tumpukan dibatalkan (jadi jangan tangkap pengecualian itu). Jika Anda masih ingin menangkap pengecualian [lainnya], gunakan:.. catch (ThreadAbortException) { throw; /* propagate */ } catch (Exception ex) { .. }
Jawaban:
Saya mencari secara online dan melihat bahwa
Response.End()
selalu ada pengecualian.Ganti ini:
HttpContext.Current.Response.End();
Dengan ini:
sumber
Response.End()
tidak tidak bekerja, mengapa jawaban disarankan memiliki jugaResponse.End()
pada baris terakhir? Sebaliknya, jawaban dari @Binny (di bawah) membantu!Ini membantu saya menangani
Thread was being aborted
pengecualian,jika Anda menggunakan kode berikut sebagai ganti
HttpContext.Current.Response.End()
, Anda akan mendapatkanServer cannot append header after HTTP headers have been sent
pengecualian.Semoga membantu
sumber
Response.End()
tidak berhasil, tetapi metode yang disarankan juga adaResponse.End()
di baris terakhir?Tampaknya pertanyaannya sama dengan:
Ketika ASP.NET System.Web.HttpResponse.End () dipanggil, utas saat ini dibatalkan?
Jadi sesuai desain. Anda perlu menambahkan tangkapan untuk pengecualian itu dan dengan anggun "mengabaikan" -nya.
sumber
Pindahkan Response.End () ke luar blok Try / Catch dan Using.
Ini seharusnya melempar Exception untuk melewati sisa permintaan, Anda tidak seharusnya menangkapnya.
sumber
Taruh saja
dalam blok terakhir alih-alih dalam blok percobaan.
Ini telah berhasil untuk saya !!!.
Saya memiliki struktur kode bermasalah (dengan Exception) berikut
dan itu melempar pengecualian. Saya menduga Exception dilemparkan di mana ada kode / pekerjaan untuk dijalankan setelah response.End (); . Dalam kasus saya, kode tambahan hanyalah pengembalian itu sendiri.
Ketika saya baru saja memindahkan respons.End (); ke blok terakhir (dan membiarkan pengembalian pada tempatnya - yang menyebabkan melewatkan sisa kode di blok percobaan dan melompat ke blok terakhir (tidak hanya keluar dari fungsi yang memuat)) Pengecualian berhenti berlangsung.
Berikut ini berfungsi dengan baik:
sumber
Gunakan blok catch khusus untuk pengecualian dari Response.End () metode
Atau hapus saja Response.End () jika Anda membuat filehandler
sumber
Bagi saya hanya bekerja
https://stackoverflow.com/a/21043051/1828356
sumber
Saya menghapus tombol tautan dari UpdatePanel dan juga mengomentari Respons.End () Berhasil !!!
sumber
kesalahan untuk Response.END (); karena Anda menggunakan panel pembaruan asp atau kontrol apa pun yang menggunakan javascript, coba gunakan kontrol asli dari asp atau html tanpa javascript atau scriptmanager atau skrip dan coba lagi
sumber
Ini bukan masalah tapi ini memang disengaja. Akar masalah dijelaskan di Halaman Dukungan Microsoft.
Metode Response.End mengakhiri eksekusi halaman dan menggeser eksekusi ke peristiwa Application_EndRequest di pipeline peristiwa aplikasi. Baris kode yang mengikuti Response.End tidak dijalankan.
Solusi yang disediakan adalah:
Untuk Response.End, panggil metode HttpContext.Current.ApplicationInstance.CompleteRequest alih-alih Response.End untuk melewati eksekusi kode ke acara Application_EndRequest
Ini tautannya: https://support.microsoft.com/en-us/help/312629/prb-threadabortexception-occurs-if-you-use-response-end--response-redi
sumber
siram respons ke klien sebelum response.end ()
Lebih lanjut tentang Metode Response.Flush
Jadi gunakan kode yang disebutkan di bawah ini sebelumnya
response.End();
sumber
Saya menggunakan semua perubahan di atas tetapi saya masih mendapatkan masalah yang sama pada aplikasi web saya.
Kemudian saya menghubungi penyedia hosting saya & meminta mereka untuk memeriksa apakah ada perangkat lunak atau antivirus yang memblokir file kami untuk ditransfer melalui HTTP. atau ISP / jaringan tidak mengizinkan file untuk ditransfer.
Mereka memeriksa pengaturan server & melewati "Data Center Shared Firewall" untuk server saya & sekarang aplikasi kami dapat mengunduh file.
Semoga jawaban ini akan membantu seseorang. Inilah yang berhasil untuk saya
sumber
Saya menemukan alasannya. Jika Anda menghapus panel pembaruan, itu akan baik-baik saja!
sumber
Saya merekomendasikan solusi ini:
Jangan gunakan
response.End();
Deklarasikan var global ini:
bool isFileDownLoad;
Tepat setelah Anda
(response.Write(sw.ToString());) set ==> isFileDownLoad = true;
Ganti Render Anda seperti:
sumber
Saya menemukan bahwa berikut ini bekerja lebih baik ...
sumber
Bagi saya itu membantu untuk mendaftarkan tombol yang memanggil kode di belakang kode sebagai kontrol pos balik.
sumber