Gestione degli errori, durante il download di file da ASP.NET Web del Gestore.ashx)

Ho una pagina web che un utente può scaricare un file PDF tramite un ASP.NET web del gestore (.ashx). È implementato come la risposta in questo domanda. Il problema che ho è quando faccio fare questo window.top.location.href = url; in JavaScript non ho alcun controllo reale su cosa succede se c’è un’eccezione nel gestore. L’esperienza dell’utente, quando tutto funziona correttamente, è che sono essenzialmente rimanere sulla pagina erano e il browser dice che essi possono scaricare il file PDF. Tuttavia, quando c’è un’eccezione nel gestore vengono reindirizzati alla URL del gestore e visualizzata una pagina vuota.

Qui è un esempio di codice per renderlo più chiaro:

JavaScript:

function openPDF() {
    var url = GeneratePDFUrl();
    window.top.location.href = url;
}

Gestore:

public override void Process(HttpContext context)
{
    byte[] pdfdata = GetPDFData();
    context.Response.ContentType = "application/pdf";
    context.Response.AddHeader("content-disposition", "attachment; filename=\"" + GetPDFFileName() + "\"");
    context.Response.AddHeader("content-length", pdfdata.Length.ToString());
    context.Response.BinaryWrite(pdfdata);
}

Il problema accade quando GetPDFData() genera un’eccezione. Stiamo facendo quello che possiamo per evitare GetPDFData() dal lancio di un’eccezione, ma è generato da input dell’utente, così siamo anche in grado di gestire qui nel caso ci sono casi noi non/non può prevedere che generano un errore.

Qui è una soluzione che ho creato, ma si è mostrato l’errore di testo (invece di una pagina vuota)

public override void Process(HttpContext context)
{
    try
    {
        byte[] pdfdata = GetPDFData();
        WritePDF(pdfdata, GetPDFFileName()); //Executes code in example above
    }
    catch (Exception e)
    {
        context.Response.Clear();
        context.Response.Write(GetErrorMessage(e));
    }
}

Idealmente vorrei mostrare all’utente un popup così, essi sono rimasti sulla pagina erano.

Se hai tutto pronto inviare l’intestazione dei file in PDF, quindi è difficile dare un messaggio diverso inviare una pagina di errore codice -pagina non trovata-, ma se non si dispone di inviare l’intestazione esempio pdf, e il nome del file di intestazione, quindi è possibile scrivere un messaggio come devi fare. Ora per rimanere sulla pagina in una finestra di dialogo, non è possibile, perché hai tutto pronto, andare a un’altra pagina, la prima pagina non hanno il controllo.

OriginaleL’autore Steve | 2013-01-30

2 Replies
  1. 7

    Prima di tutto questa la risposta della mia l’utente chieda come fare il download javascript. Ma se il link non è necessario aggiungere javascript, si può aggiungere anche dell’uso di un normale link per il download.

    Ora molti siti web utilizzano una pagina con un testo che dice “e ora il download si avvia in pochi secondi. Se non si avvia, si prega di fare clic qui bla bla bla“. Uno dei motivi è simile alla tua, l’utente deve sapere che qualcosa inizierà il download in pochi secondi e se non, quindi l’utente a capire che c’è un problema con altri extra messaggio.

    In generale quando si ha intenzione di inviare un file per il download, non si è nella pagina, è possibile non inviare il messaggio al centro del download, o quando il file termina con un pdf, quindi probabilmente non ti mostra nulla su una pagina web. Quindi dal mio punto di vista se si hanno problemi e generare eccezioni, è necessario progettare alcuni passi su come informare l’utente che qualcosa stava andando storto – come il medio pagina che informa l’utente che “ora che si sta per ricevere un file se il file non si avvia il download in pochi secondi, si prega di farlo”

    Tuttavia, quando c’è un’eccezione nel gestore sono
    reindirizzati alla URL del gestore e visualizzata una pagina vuota.

    Per evitare che il nero della pagina di errore, è possibile restituire il codice e l’utente è rimanere sulla pagina, ma ancora non ha ottenuto alcun messaggio di errore.

    Response.TrySkipIisCustomErrors = true;
    Response.Status = "204 No Content";
    Response.StatusCode = 204;
    Response.End();

    Alternativa in caso di eccezione si può cercare di reindirizzare lui per un errore di pagina utilizzando il

    Response.Redirect("errorpage.aspx");

    e forse è possibile inviare e qualche errore id.

    Si può anche provare a vedere un semplice messaggio come

    context.Response.ContentType = "text/html";
    context.Response.Write("Error downloading file - Please contact with us");
    Grazie per la risposta – la vostra Risposta.Redirect-fu la risposta-siamo andati con.
    Sei il benvenuto.

    OriginaleL’autore Aristos

  2. 2

    Se invece di impostazione href della finestra, impostare il src di un iframe nascosto. È quindi possibile fare qualche trucchetto con il valore restituito in iframe nascosto, come:

    context.Response.Clear();
    context.Response.Write("<script>alert('" + GetErrorMessage(e) + "');</script>");

    Questo semplice esempio sarebbe solo avviso il messaggio di errore. Se siete sullo stesso dominio (ho il sospetto che tu sia!) poi si può ottenere di più intelligente, invece di allarme, chiamando un metodo di genitore, ad esempio,

    context.Response.Clear();
    context.Response.Write("<script>window.parent.someFunction('" + GetErrorMessage(e) + "');</script>");

    Ecco un esempio che ho trovato sul MODO di fare proprio questo: Recupero codice di stato HTTP caricato da iframe con Javascript

    È un upload, non un download, ma stesso concetto.

    OriginaleL’autore Eli Gassert

Lascia un commento