Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it L'avatar di exFelino
    Registrato dal
    Jul 2014
    residenza
    Aci Catena (CT)
    Messaggi
    658

    ASP.net MVC: Exception e chiamata AJAX

    Ciao a tutti,
    sto realizzando un'applicazione basata su ASP.net MVC.

    Tramite Ajax effettuo la chiamata ad diversi metodo, esempio può essere:
    codice:
    public ActionResult MyMethod(DateTime ref_date) { 
                try
                {
                    //code
    
                    return new FileContentResult(stream.ToArray(), "application/pdf");
                }
                catch (Exception ex)
                {
                    return StatusCode((int)HttpStatusCode.InternalServerError, ex.Message);
                }
    }
    Se l'eccezione non scatta, nella success della chiamata ajax eseguo la procedura desiderata...

    Se viene generata l'eccezione, scatta l'error della chiamata ajax, ma non riesco a catturare in alcun modo l'ex.Message:
    codice:
    error: function (err, type, httpStatus) {
        console.log(err);
        var failureMessage = 'Error occurred in ajax call ' + err.status + " - " + err.responseText + " - " + httpStatus;
        console.log(failureMessage);
        console.log(err.responseText);
    }
    Se ad esempio il metodo va in eccezione perchè il file usato come modello è lockato da un altro processo, nell'eccezione del metodo lo vedo, nella chiamata Ajax no, non riesco a catturarlo.

    Probabilmente sbaglio il tipo di ritorno in caso di exception?

    Grazie.
    Ultima modifica di exFelino; 23-05-2020 a 01:46

  2. #2
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,744
    eccezione a parte, forse la grandezza del json di default è troppo piccola, trattandosi di files

    <appSettings>
    <add key="aspnet:MaxJsonDeserializerMembers" value="150000" />
    </appSettings>


    comunque l'eccezione la vedi dal debugger del browser...
    Ultima modifica di djciko; 23-05-2020 a 12:15

  3. #3
    Utente di HTML.it L'avatar di exFelino
    Registrato dal
    Jul 2014
    residenza
    Aci Catena (CT)
    Messaggi
    658
    Il file viene generato senza problemi, qualunque sia la dimensione.

    La stringa del messaggio dell'eccezione non riesco a catturare...

  4. #4
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,744
    non capisco quale eccezione, se va tutto a buon fine...

    comunque, hai provato a guardare negli errori della consolle di debug ? (f12)

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    1,254
    Ciao,
    lascia fare alla Exception il suo lavoro, non catturarla nel metodo del server, Quando andrà in errore vedrai che la catturi sul client

  6. #6
    Utente di HTML.it L'avatar di exFelino
    Registrato dal
    Jul 2014
    residenza
    Aci Catena (CT)
    Messaggi
    658
    Si, sia nel body della risposta, non c'è nulla...

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    1,254
    Cerca meglio...
    Immagine.pngImmagine2.png

    responseText restituisce una pagina, alcuni dettagli:
    codice:
    <div id="exceptionDetail1" class="rawExceptionDetails">
                                    <pre class="rawExceptionStackTrace">System.Exception: Ops!
       at ...
    Ultima modifica di U235; 27-05-2020 a 17:37

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    1,254
    mmm ho l'impressione che i miei messaggi non si vedano in alcuni casi. anche ora (prima di postare questo) non si vede come ultima risposta e rileggendo mi da l'impressione che exFelino non abbia letto la mia risposta sopra e stesse rispondendo a djciko.

    in ogni caso ne approfitto per aggiungere che se invece vuoi proprio gestire a mano la risposta intercettando l'eccezione sul server, puoi elaborarla così (testato in net core):
    codice:
    try
                {
                    throw new Exception();
                }
                catch (Exception ex)
                {
                     Response.StatusCode = (int)HttpStatusCode.InternalServerError;               
                     return StatusCode(Response.StatusCode, "Nooooo il file è bloccato!");
                }
    In questo caso respondText ti restituisce solo quello che vuoi tu (es: "Nooooo il file è bloccato!").
    Ultima modifica di U235; 27-05-2020 a 19:06

  9. #9
    Utente di HTML.it L'avatar di exFelino
    Registrato dal
    Jul 2014
    residenza
    Aci Catena (CT)
    Messaggi
    658
    Grazie, @u235 effettivamente sto leggendo solo ora i tuoi messaggi, non avevo ricevuto neanche la notifica via email.

    Ho provato con un tool come PostMan, l'errore viene visualizzato correttamente, forse c'è qualcosa da modificare lato client come chiamo il metodo....

    Posto il codice della chiamata:
    codice:
    $.ajax({        type: "POST",
            url: url_with_params,
            headers: {
                'Authorization': 'Bearer ' + sessionStorage.getItem(JWTTokenName),
                'Content-Type': "application/json;charset=UTF-8"
            },
            // Seems like the only way to get access to the xhr object
            xhr: function () {
                var xhr = new XMLHttpRequest();
                xhr.responseType = 'blob'
                return xhr;
            },
            data: jsonData,
            cache: true,
            success: function (data, status, xhr) {
                var blob = new Blob([data], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" });
    
    
                var downloadUrl = URL.createObjectURL(blob);
    
    
                //Get fileName
                var headers = xhr.getAllResponseHeaders();
                var arr = headers.trim().split(/[\r\n]+/);
                // Create a map of header names to values
                var headerMap = {};
                arr.forEach(function (line) {
                    var parts = line.split(': ');
                    var header = parts.shift();
                    var value = parts.join(': ');
                    headerMap[header] = value;
                });
                var fileName = headerMap["content-disposition"];
    
    
                var a = document.createElement("a");
                a.href = downloadUrl;
                a.download = fileName;
                document.body.appendChild(a);
                a.click();
                document.body.removeChild(a);
            },
            error: function (err, type, httpStatus) {
                var failureMessage = 'Error occurred in ajax call ' + err.status + " - " + err.responseText + " - " + httpStatus;
    			console.log(failureMessage);
            }
        });

  10. #10
    Utente di HTML.it L'avatar di exFelino
    Registrato dal
    Jul 2014
    residenza
    Aci Catena (CT)
    Messaggi
    658
    Ho trovato l'errore, modificando questa parte della chiamata ajax:


    - se la risposta è success allora il type atteso è un blob
    - se la risposta è error allora il type atteso è un text


    codice:
    xhr: function () {
                var xhr = new XMLHttpRequest();
                xhr.onreadystatechange = function () {
                    if (xhr.readyState == 2) {
                        if (xhr.status == 200) {
                            xhr.responseType = "blob";
                        } else {
                            xhr.responseType = "text";
                        }
                    }
                };
                return xhr;
            },

    Grazie!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2020 vBulletin Solutions, Inc. All rights reserved.