Próbowałem przekonwertować mój zestaw danych do programu Excel i pobrać ten plik Excel. Otrzymałem wymagany plik programu Excel, ale System.Threading.ThreadAbortException był podnoszony przy każdym pobieraniu programu Excel. Jak rozwiązać ten problem? .. Pomóż mi ...
Wywołuję tę metodę na moim ekranie aspx.There także ten sam wyjątek został zgłoszony przez tę metodę.
Wywołuję tę publiczną funkcję void ExportDataSet (DataSet ds) na wielu ekranach aspx, a także utrzymuję metodę rejestratora błędów dla wyjątków, które są zgłaszane w czasie wykonywania, a te wyjątki są zapisywane w plikach .txt. Tak więc ten sam wyjątek jest rejestrowany we wszystkich plikach txt ekranu aspx.I chcę tylko uniknąć tego wyjątku zgłasza z pliku klasy zadeklarowanej metody do aspx. Po prostu chcę obsłużyć ten wyjątek w moim pliku klasy deklaracji metody.
Wywołanie metody pliku ASPX: excel.ExportDataSet (dsExcel);
Definicja metody:
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
zobaczyć stackoverflow.com/a/3917180/2864740 (i innych wskazań); zwróć uwagę, że wyjątek jest „oczekiwany”, ponieważ jest to sposób rozwijania stosu (więc nie łapaj tego wyjątku). Jeśli nadal chcesz złapać [inne] wyjątki, użyj:.. catch (ThreadAbortException) { throw; /* propagate */ } catch (Exception ex) { .. }
Odpowiedzi:
Poszukałem informacji w Internecie i zobaczyłem, że
Response.End()
zawsze rzuca wyjątek.Zastąp to:
HttpContext.Current.Response.End();
Z tym:
źródło
Response.End()
nie nie działa, dlaczego proponowana odpowiedź równieżResponse.End()
w ostatniej linii? Zamiast tego pomaga odpowiedź od @Binny (poniżej)!To pomogło mi poradzić sobie z
Thread was being aborted
wyjątkiem,jeśli zamiast tego
HttpContext.Current.Response.End()
użyjesz następującego kodu , otrzymaszServer cannot append header after HTTP headers have been sent
wyjątek.Mam nadzieję, że to pomoże
źródło
Response.End()
prawda nie działa, ale sugerowana metoda działa teżResponse.End()
w ostatniej linijce?Wygląda na to samo pytanie, co:
Gdy wywoływana jest metoda ASP.NET System.Web.HttpResponse.End (), bieżący wątek jest przerywany?
Więc to jest zgodne z projektem. Musisz dodać haczyk dla tego wyjątku i wdzięcznie go „zignorować”.
źródło
Przenieś Response.End () poza bloki Try / Catch i Using.
Przypuszcza się, że rzuca wyjątek, aby ominąć resztę żądania, po prostu nie miałeś go złapać.
źródło
Po prostu włóż
w ostatnim bloku zamiast w bloku try.
To zadziałało dla mnie !!!.
Miałem następującą problematyczną (z wyjątkiem) strukturę kodu
i zgłasza wyjątek. Podejrzewam, że wyjątek jest generowany, gdy istnieje kod / praca do wykonania po odpowiedzi.End (); . W moim przypadku dodatkowym kodem był sam zwrot.
Kiedy właśnie przeniosłem odpowiedź.End (); do ostatniego bloku (i pozostawił powrót na swoim miejscu - co powoduje pominięcie reszty kodu w bloku try i przeskoczenie do ostatniego bloku (a nie tylko wyjście z funkcji zawierającej)) wyjątek przestał mieć miejsce.
Następujące działa OK:
źródło
Użycie specjalnego bloku złapać za wyjątkiem Response.End () Sposób
Lub po prostu usuń Response.End (), jeśli budujesz program do obsługi plików
źródło
U mnie działa tylko
https://stackoverflow.com/a/21043051/1828356
źródło
Usunąłem linkbutton z UpdatePanel i skomentowałem również Response.End () Success !!!
źródło
błąd dla Response.END (); Dzieje się tak, ponieważ używasz panelu aktualizacji asp lub dowolnego elementu sterującego, który używa javascript, spróbuj użyć natywnej kontroli z asp lub html bez javascript lub scriptmanager lub skryptów i spróbuj ponownie
źródło
To nie jest problem, ale jest to zamierzone. Główna przyczyna jest opisana na stronie pomocy technicznej firmy Microsoft.
Metoda Response.End kończy wykonywanie strony i przenosi wykonanie do zdarzenia Application_EndRequest w potoku zdarzeń aplikacji. Wiersz kodu następujący po Response.End nie jest wykonywany.
Dostarczone rozwiązanie to:
W przypadku Response.End wywołaj metodę HttpContext.Current.ApplicationInstance.CompleteRequest zamiast Response.End, aby ominąć wykonanie kodu do zdarzenia Application_EndRequest
Oto link: https://support.microsoft.com/en-us/help/312629/prb-threadabortexception-occurs-if-you-use-response-end--response-redi
źródło
opróżnij odpowiedź do klienta przed response.end ()
Więcej o metodzie Response.Flush
Więc użyj wcześniej wymienionego poniżej kodu
response.End();
źródło
Wykorzystałem wszystkie powyższe zmiany, ale nadal otrzymywałem ten sam problem w mojej aplikacji internetowej.
Następnie skontaktowałem się z moim dostawcą usług hostingowych i poprosiłem ich o sprawdzenie, czy jakieś oprogramowanie lub program antywirusowy blokuje nasze pliki do przesyłania przez HTTP. lub ISP / sieć nie zezwala na przesyłanie plików.
Sprawdzili ustawienia serwera i ominęli "Data Center Shared Firewall" dla mojego serwera, a teraz nasza aplikacja może pobrać plik.
Mam nadzieję, że ta odpowiedź komuś pomoże. To właśnie zadziałało dla mnie
źródło
Znalazłem powód. Jeśli usuniesz panele aktualizacji, wszystko będzie dobrze!
źródło
Polecam to rozwiązanie:
Nie używaj
response.End();
Zadeklaruj tę zmienną globalną:
bool isFileDownLoad;
Zaraz po twoim
(response.Write(sw.ToString());) set ==> isFileDownLoad = true;
Zastąp Render jak:
źródło
Okazało się, że poniższe działa lepiej ...
źródło
U mnie pomogło zarejestrowanie przycisku, który wywołuje kod za kodem jako formant ogłaszania zwrotnego.
źródło