2011-09-17 10 views
6

Ho sviluppato un'applicazione Web sul mio computer locale da alcuni giorni utilizzando Visual Studio 2010. Ieri sera ho distribuito la mia applicazione su IIS 7 e sono incappato in un grande spettacolo stopper. Il problema è legato alla gestione degli errori nella richiesta Ajax. Per cominciare ho alcune schermate di modifica che funzionano su richiesta Ajax. Ecco come appare la parte ajax della schermata di modifica di Ajax.Dubbi relativi alla gestione degli errori nelle richieste Ajax in ASP.net MVC

@using (Ajax.BeginForm("_CityEdit", null, new AjaxOptions { HttpMethod = "Post", UpdateTargetId = "content", 
                  LoadingElementId="imgSaveLoading", OnFailure="onError", 
                  OnSuccess = "onSuccess" }, new { id = "frmCity" })) { 
    <img id="imgSaveLoading" alt="loading" src="@Url.Content("~/Content/Telerik/Vista/loading.gif")" class="ajax-loader-user" /> 
    <div class="content" id="content"> 
     @{Html.RenderPartial("_CityEdit");} 
    </div> 

    <!-- Some Other code here --> 
} 

Contavo sul callback "onError" del Ajax.BeginForm sopra(). Quindi nel mio controller, ogni volta che volevo visualizzare l'errore all'utente (errore del modello o qualsiasi altro errore), ho impostato la risposta del server su 500 (Internal Server Error) sperando ottimisticamente che ciò avrebbe comportato il gestore "OnError" di Ajax.BeginForm() viene invocato. Ecco un frammento di come ho fatto questo nel mio controller.

[HttpPost] 
public ActionResult _CityEdit(CityViewModel viewModel) { 
    city = cityManager.FindCity(viewModel.City.Id, false); 
    // Validate Model here 
    if (!TryUpdateModel(city, "City")) { 
     Response.StatusCode = 500; 
     return PartialView("_CityEdit", viewModel); 
    } 

Come si può vedere da sopra il codice, sono tornato PartialView e se contenesse errori modello, otterrà automaticamente visualizzato sullo schermo Ajax Edit. Quindi nel JavaScript "OnError" ho appena sostituito il relativo div con il PartialView restituito dal controller qualcosa del genere.

function onError(xhr) { 
    $('#content').html(xhr.responseText); 
} 

Questo ha funzionato perfettamente sulla mia macchina di sviluppo. Quando ho distribuito la mia applicazione su IIS 7 e l'ho acceduta da una finestra di Windows XP (con IE 8 o Chrome), invece di PartialView, i browser hanno appena visualizzato la schermata predefinita "500 Internal Server Error". Quindi ho qualche dubbio che mi ha fatto non dormire bene la notte scorsa.

  1. È l'approccio che ho utilizzato per l'editing Ajax ragionevole. In caso contrario, potrei aver gestito l'Ajax Editing (con la possibilità di visualizzare errori del modello).

  2. Da quando sviluppo questi moduli da alcuni giorni e ho fatto sforzi considerevoli, c'è del tutto da fare per farlo funzionare su XP box. Fondamentalmente, sarebbe l'ideale se potessi in qualche modo impedire al browser di visualizzare la loro schermata predefinita "500 Internal Server Error".

  3. E 'questo approccio di lavoro su Windows 7, perché ho IIS 7 installato sulla stessa macchina Windows 7 che sto usando per navigare al sito, o il suo solo che funziona bene con Windows 7.

Se qualche altro suggerimento, per favore andare avanti.

Modifica: Ho trovato la soluzione alternativa per il mio problema. Ciò significa che il dubbio n. 2 e 3 non riceve risposta. Fondamentalmente la seguente voce in web.config impedisce al browser di mostrare le pagine del browser predefinite per il sito web.

<system.webServer> 
     <httpErrors errorMode="Detailed"/> 
    </system.webServer> 

Ma questo lascia ancora il mio primo dubbio. Ho usato un approccio ragionevole all'editing di Ajax?


ho controllato la risposta con il violinista ed era IIS che è stato l'invio di pagina di errore predefinita per l'errore del server 500. Quindi deve essere configurato per restituire la risposta "dettagliata". Possiamo farlo usando il gestore IIS. Un'altra opzione che stavo seguendo è quella di definirlo a livello di applicazione nel file web.config dell'applicazione.

Tuttavia, sono di nuovo in un dilemma se andare con questo approccio o rielaborare la mia intera domanda. Il problema che si verifica è che se c'è davvero qualche modulo che non funziona con 500 Internal Server, il mio codice viene esposto nel browser poiché errorMode è impostato su "Detailed". Quindi ho bisogno di un modo per fornire la mia risposta personalizzata quando imposto il codice di errore di risposta a 500 e se qualche altra parte dell'applicazione fallisce (non sono quella che imposta il codice di stato 500) allora la pagina di errore predefinita dovrebbe essere inviata invece di esporre il mio codice attraverso la risposta "dettagliata". Qualsiasi aiuto per favore.

saluti, NIvan.

+0

Strano che dettagliata (o RemoteOnly e si sono remote.) le pagine di errore potrebbero risolvere il tuo problema. Vuoi dire che l'intera pagina è stata sostituita dalla schermata di errore, piuttosto che dal content div? Questo ha anche aggiornato l'URL corrente nel browser? Questo suona più come la chiamata AJAX stessa fallita, perché non dovrebbe mai risultare in un normale GET/POST - dovrebbe essere visualizzato solo tramite JS. Penso che la tua tecnica sia accettabile dal momento che non puoi mai proteggere contro i 500 dalle chiamate AJAX * comunque * - 'OnError' dovrebbe essere sufficiente per gestirli. Penso che dovresti cercare la causa di "OnError" che non funziona prima nell'ambiente distribuito. – bzlm

+0

@bzlm, sono abbastanza sicuro che il browser abbia trascurato l'intera risposta che ho restituito dal controller per la richiesta ajax data quando ho impostato lo stato di risposta su 500. In qualche modo, il browser ha visualizzato la propria schermata "500 Internal Server Error". Ma avevi ragione che solo il contenuto del contenuto div è stato sostituito dalla pagina "500 Errore interno del server". Le altre parti della mia pagina html sono rimaste come prima. Tuttavia, ho dovuto impedire al browser di visualizzare la sua pagina di errore e in effetti "errorMode" ha risolto il problema. Non ho cambiato nient'altro nella mia domanda (per quanto ne so). Grazie. – Jatin

+0

@bzlm, ecco dove ho trovato la soluzione. http://www.bala-krishna.com/how-to-disable-500-internal-server-error-on-godaddy-windows-hosting/ – Jatin

risposta