2011-09-17 17 views
6

He estado desarrollando una aplicación web en mi máquina local por algunos días usando Visual Studio 2010. Anoche implementé mi aplicación en IIS 7 y tropecé frustrantemente con una gran show stopper. El problema está relacionado con el manejo de errores en la solicitud de Ajax. Para empezar, tengo algunas pantallas de edición que funcionan con una solicitud ajax. Aquí está la apariencia de la parte Ajax de la pantalla de edición de Ajax.Dudas relacionadas con el manejo de errores en solicitudes Ajax en 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 --> 
} 

I se basaba en la devolución de llamada "onError" de la Ajax.BeginForm arriba(). Entonces, en mi controlador, cada vez que quería mostrar el error al usuario (error de modelo o cualquier otro error), configuro la respuesta del servidor a 500 (Internal Server Error) optimistamente esperando que esto daría como resultado el controlador "OnError" de Ajax.BeginForm() siendo invocado Aquí hay un fragmento de cómo hice esto en mi controlador.

[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); 
    } 

Como se puede ver desde arriba código, regresaron PartialView y si contenía errores en el modelo, se obtendrá automáticamente aparece en la pantalla de edición Ajax. Luego, en el JavaScript "OnError" simplemente reemplazo el div relacionado con PartialView devuelto por el controlador, algo así.

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

Todo funcionó de maravilla en mi máquina de desarrollo. Cuando implementé mi aplicación en IIS 7 y accedí a ella desde un cuadro de Windows XP (con IE 8 o Chrome), en lugar de PartialView, los navegadores solo muestran la pantalla predeterminada "500 Internal Server Error". Así que tengo algunas dudas que me hicieron no dormir bien anoche.

  1. El enfoque que he usado para la edición de Ajax es razonable. De lo contrario, podría ser la (s) otra (s) forma (s) en que podría haber manejado la Edición Ajax (con la capacidad de mostrar los errores del modelo).

  2. Como he estado desarrollando estos módulos durante algunos días y he realizado un esfuerzo considerable, ¿hay algún problema para hacerlo funcionar en la caja de XP? Básicamente, sería ideal si de alguna manera pudiera evitar que el navegador muestre su pantalla predeterminada "500 Internal Server Error".

  3. Es este enfoque de trabajo en Windows 7, porque tengo IIS 7 instalado en las mismas ventanas 7 máquina que estoy utilizando para navegar por el sitio, o es sólo que funciona bien con Windows 7.

Si tiene alguna otra sugerencia, continúe.

Editar: He encontrado la solución a mi problema. Entonces eso significa duda, no se responden 2 y 3. Básicamente, la siguiente entrada en web.config impide que el navegador muestre las páginas predeterminadas del navegador para el sitio web.

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

Pero eso todavía deja fuera mi primera duda. ¿He usado un enfoque razonable para editar Ajax?


he comprobado la respuesta con el violinista y fue IIS que estaba enviando página de error por defecto para el error de servidor 500. Por lo tanto, necesita ser configurado para devolver la respuesta "detallada". Podemos hacer esto usando el administrador de IIS. Otra opción que estaba siguiendo es definirla a nivel de aplicación en el archivo web.config de la aplicación.

Sin embargo, estoy de nuevo en un dilema si seguir este enfoque o volver a trabajar toda mi aplicación. El problema que ocurre es que si realmente hay algún módulo que falla con 500 Internal Server, mi código queda expuesto en el navegador ya que el modo de error se establece en "Detailed". Así que necesito alguna manera de proporcionar mi respuesta personalizada cuando establezco el código de error de respuesta a 500 y si falla alguna otra parte de la aplicación (no soy el que configura el código de estado 500), entonces debería enviarse la página de error predeterminada en lugar de exponer mi código a través de una respuesta "detallada". Cualquier ayuda por favor.

respetos, NIrvan.

+0

extraño que detallada (o RemoteOnly y que son a distancia). las páginas de error resolverían su problema. ¿Quiere decir que toda la página fue reemplazada por la pantalla de error, en lugar de la div de contenido? ¿Eso también actualizó la URL actual en el navegador? Eso suena más como si la llamada AJAX en sí misma fallara, porque nunca debería dar como resultado un GET/POST normal, solo debería renderizarse a través de JS. Creo que su técnica es aceptable, ya que nunca se puede proteger contra 500s de las llamadas AJAX * de todos modos * - 'OnError' debería ser suficiente para manejarlos. Creo que debería desenterrar la causa de que 'OnError' no funcione primero en el entorno desplegado. – bzlm

+0

@bzlm, estoy bastante seguro de que el navegador omitió toda la respuesta que devolví del controlador para la solicitud ajax dada cuando establecí el estado de respuesta en 500. De alguna manera, el navegador mostró su propia pantalla "500 Internal Server Error". Pero tenía razón en que solo el contenido del div de contenido fue reemplazado por la página "500 Internal Server Error". Las otras partes de mi página html permanecieron como antes. Pero aún así, tuve que evitar que el navegador mostrara su página de error y, de hecho, el "errorMode" resolvió el problema. No cambié nada más en mi aplicación (hasta donde yo sé). Gracias. – Jatin

+0

@bzlm, aquí es donde encontré la solución. http://www.bala-krishna.com/how-to-disable-500-internal-server-error-on-godaddy-windows-hosting/ – Jatin

Respuesta