Ich habe versucht, mein Dataset in Excel zu konvertieren und dieses Excel herunterzuladen. Ich habe meine erforderliche Excel-Datei erhalten. Aber System.Threading.ThreadAbortException wurde bei jedem Excel-Download ausgelöst. Wie kann ich dieses Problem beheben? .. Bitte helfen Sie mir ...
Ich rufe diese Methode in meinem Aspx-Bildschirm auf. Es gibt auch dieselbe Ausnahme, die von dieser Methode ausgelöst wurde.
Ich nenne diese öffentliche void ExportDataSet (DataSet ds) -Funktion in vielen Aspx-Bildschirmen und behalte auch die Fehlerprotokollierungsmethode für Ausnahmen bei, die zur Laufzeit ausgelöst werden, wenn diese Ausnahmen in eine TXT-Datei geschrieben werden. Daher wird dieselbe Ausnahme in allen txt-Dateien des Aspx-Bildschirms protokolliert. Ich möchte nur vermeiden, dass diese Ausnahme von einer von der Methode deklarierten Klassendatei zu Aspx ausgelöst wird. Ich möchte diese Ausnahme einfach nur in meiner Methodendeklarationsklassendatei selbst behandeln.
Aufruf der ASPX-Dateimethode: excel.ExportDataSet (dsExcel);
Methodendefinition:
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
siehe stackoverflow.com/a/3917180/2864740 (und die anderen Antworten); Beachten Sie, dass die Ausnahme "zu erwarten" ist, da der Stapel so abgewickelt wird (fangen Sie diese Ausnahme also nicht ab). Wenn Sie immer noch [andere] Ausnahmen abfangen möchten, verwenden Sie:.. catch (ThreadAbortException) { throw; /* propagate */ } catch (Exception ex) { .. }
Antworten:
Ich habe online recherchiert und festgestellt, dass das
Response.End()
immer eine Ausnahme auslöst.Ersetzen Sie dies:
HttpContext.Current.Response.End();
Mit diesem:
quelle
Response.End()
dies nicht funktioniert, warum steht die vorgeschlagene Antwort auchResponse.End()
in der letzten Zeile? Stattdessen hilft die Antwort von @Binny (unten)!Dies hat mir geholfen, mit
Thread was being aborted
Ausnahmen umzugehen .Wenn Sie anstelle des folgenden Codes den folgenden Code verwenden
HttpContext.Current.Response.End()
, erhalten Sie eineServer cannot append header after HTTP headers have been sent
Ausnahme.Ich hoffe es hilft
quelle
Response.End()
zwar nicht funktioniert, aber die vorgeschlagene Methode auchResponse.End()
in der letzten Zeile steht?Scheint die gleiche Frage zu sein wie:
Wenn ein ASP.NET System.Web.HttpResponse.End () aufgerufen wird, wird der aktuelle Thread abgebrochen?
Es ist also beabsichtigt. Sie müssen einen Haken für diese Ausnahme hinzufügen und ihn ordnungsgemäß "ignorieren".
quelle
Verschieben Sie Response.End () außerhalb der Try / Catch- und Using-Blöcke.
Es wird angenommen, dass Sie eine Ausnahme auslösen, um den Rest der Anforderung zu umgehen. Sie sollten sie nur nicht abfangen.
quelle
Setzen Sie einfach die
innerhalb eines finally- Blocks anstelle des try-Blocks.
Das hat bei mir geklappt !!!.
Ich hatte die folgende problematische (mit der Ausnahme) Codestruktur
und es löst die Ausnahme aus. Ich vermute, dass die Ausnahme ausgelöst wird, wenn nach der Antwort Code / Arbeit ausgeführt werden muss.End (); . In meinem Fall war der zusätzliche Code nur die Rückgabe selbst.
Als ich gerade die Antwort verschoben habe.End (); Für den finally-Block (und die Rückgabe an ihrer Stelle belassen - was dazu führt, dass der Rest des Codes im try-Block übersprungen wird und zum finally-Block gesprungen wird (nicht nur die enthaltende Funktion verlassen)) wurde die Ausnahme nicht mehr ausgeführt.
Folgendes funktioniert OK:
quelle
Verwenden Sie einen speziellen catch-Block für die Ausnahme der Response.End () -Methode
Oder entfernen Sie einfach Response.End (), wenn Sie einen Dateihandler erstellen
quelle
Bei mir funktioniert nur
https://stackoverflow.com/a/21043051/1828356
quelle
Ich habe den Linkbutton aus dem UpdatePanel entfernt und auch den Response.End () Success kommentiert !!!
quelle
der Fehler für Response.END (); Weil Sie ein Asp-Update-Panel oder ein Steuerelement verwenden, das Javascript verwendet, versuchen Sie, ein natives Steuerelement aus Asp oder HTML ohne Javascript oder Scriptmanager oder Scripting zu verwenden, und versuchen Sie es erneut
quelle
Dies ist kein Problem, aber dies ist beabsichtigt. Die Hauptursache wird auf der Microsoft Support-Seite beschrieben.
Die Response.End-Methode beendet die Seitenausführung und verschiebt die Ausführung auf das Application_EndRequest-Ereignis in der Ereignispipeline der Anwendung. Die Codezeile, die auf Response.End folgt, wird nicht ausgeführt.
Die bereitgestellte Lösung lautet:
Rufen Sie für Response.End die Methode HttpContext.Current.ApplicationInstance.CompleteRequest anstelle von Response.End auf, um die Codeausführung für das Ereignis Application_EndRequest zu umgehen
Hier ist der Link: https://support.microsoft.com/en-us/help/312629/prb-threadabortexception-occurs-if-you-use-response-end--response-redi
quelle
Leeren Sie die Antwort an den Client, bevor Sie auf response.end () antworten.
Weitere Informationen zur Response.Flush-Methode
Verwenden Sie also vorher den unten genannten Code
response.End();
quelle
Ich habe alle oben genannten Änderungen verwendet, aber ich habe immer noch das gleiche Problem in meiner Webanwendung erhalten.
Dann kontaktierte ich mein Hosting-Angebot und bat sie zu prüfen, ob Software oder Antivirenprogramme unsere Dateien für die Übertragung über HTTP blockieren. oder ISP / Netzwerk lässt keine Dateiübertragung zu.
Sie haben die Servereinstellungen überprüft und die "Data Center Shared Firewall" für meinen Server umgangen. Jetzt kann unsere Anwendung die Datei herunterladen.
Hoffe, diese Antwort wird jemandem helfen. Das hat bei mir funktioniert
quelle
Ich habe den Grund gefunden. Wenn Sie Update-Panels entfernen, funktioniert es einwandfrei!
quelle
Ich empfehle diese Lösung:
Nicht benutzen
response.End();
Deklarieren Sie diese globale Variable:
bool isFileDownLoad;
Gleich nach deinem
(response.Write(sw.ToString());) set ==> isFileDownLoad = true;
Überschreiben Sie Ihren Render wie folgt:
quelle
Ich fand, dass das Folgende besser funktionierte ...
quelle
Für mich hat es geholfen, eine Schaltfläche zu registrieren, die Code hinter Code als Postback-Steuerelement aufruft.
quelle