Reindirizzamento di una pagina dopo il download di un PDF

Ho una pagina aspx (ad esempio 1.aspx) da dove in primo luogo sto scaricando un file pdf e poi voglio redirect a qualche pagina Thanks.aspx. Il codice è questo:

protected void btnSubmit_Click(object sender, EventArgs e) { string pathId = string.Empty; if (Page.IsValid) { try { pathId = hidId.Value; DownloadPDF(pathId); Response.Redirect("Thanks.aspx"); } catch (Exception ex) { throw ex; } } } protected void DownloadPDF(string pathId) { if (!(string.IsNullOrEmpty(pathId))) { try { Response.ContentType = "application/pdf"; Response.AppendHeader("Content-Disposition", "attachment; filename=" + pathId + ".pdf"); string path = ConfigurationManager.AppSettings["Pdf_Path"].ToString() + "\\" + pathId.Trim() + ".pdf"; Response.TransmitFile(path); } catch (Exception ex) { throw ex; } finally { HttpContext.Current.ApplicationInstance.CompleteRequest(); } } } 

Il problema è che la finestra di dialogo per il salvataggio dei file sta arrivando correttamente e sono in grado di scaricare anche il file, ma non viene reindirizzato alla pagina Thanks.aspx.

Come risolvere questo?

Ho trovato più facile mettere la pagina di download PDF in un iframe. In questo modo è ansible triggersre il download di PDF sul lato client semplicemente puntando la sorgente di iframe alla pagina di download PDF. Dopodiché puoi passare a una nuova pagina, o semplicemente mostrare il testo di ringraziamento direttamente nella pagina che contiene l’iframe.

Se il file è appena scaricato, non viene eseguita alcuna pre-elaborazione, puoi provare quanto segue:

 Response.AddHeader("Refresh", "12;URL=nextpage.aspx"); 

Dove il numero è i secondi prima che l’aggiornamento sia completato 🙂

In HTTP, una richiesta può avere una sola risposta. Poiché la prima risposta è il file PDF, la risposta dei secondi (ad esempio il reindirizzamento) non può essere implementata.

Puoi provare a riprogettare le due pagine reindirizzando a thanks.aspx e avere thanks.aspx avviare il download automaticamente.

A Response.Redirect invia in realtà una risposta al browser che in pratica dice che questa risorsa è stata spostata su un altro URL. Tuttavia, stai cercando di inviare un file anche in una risposta, quindi quelle due cose probabilmente si scontrano tra loro. Prova a rimandare un po ‘di JavaScript che li invia alla pagina che vuoi inviare anche tu invece di usare Response.Redirect.

 ScriptManager.RegisterStartupScript(Me, Me.GetType(), "redirectScript", "window.location.href='whateverurlhere.aspx';", True) 

Vedi l’articolo citato in questa risposta accettata: https://stackoverflow.com/a/11018277/1037864 (link diretto: http://gruffcode.com/2010/10/28/detecting-the-file-download-dialog- in-the-browser / )

L’idea è di impostare un cookie e inviarlo insieme al file. Nel frattempo lasci che la pagina di attesa blocchi l’interfaccia mentre è in attesa che il cookie arrivi.