none
Mi propio HttpException RRS feed

  • Pregunta

  • Hola a todos.

    Estoy haciendo un sitio en MVC y realizo algunas validaciones. Cuando los datos no complen con mi validación estoy haciendo un 

    throw new HttpException((int)System.Net.HttpStatusCode.Unauthorized, "El detalle de mi error");

    Pero la respuesta que le llega al navegador de internet viene con información de más que no quiero que venga. Es decir siempre me retorna una pagina completa con un HTML completo (<head></head><body></body>), y yo no quiero que me retorne todo ese HTML solo quiero el mensaje que yo el pongo.

    Gracias por la ayuda

    miércoles, 4 de marzo de 2015 15:56

Respuestas

  • hola

    es correcto puedes controlar el exception y convertir eso a un JsonResult

    o podrias controlar el error en el $.ajax

    return Json error from ASP.NET MVC

    como veras puedes definir un StatusCode en el Response para atrapar el error en $.ajax

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Jose Elias miércoles, 4 de marzo de 2015 20:34
    miércoles, 4 de marzo de 2015 18:53
  • Gracias.

    Me sirvió tu respuesta, solo la tuve que adaptar de la siguiente manera, pero me sirvieron tus comentarios. gracias

    string error = "MI MENSAJE DE ERROR EN FORMATO JSON";
    HttpResponse response = HttpContext.Current.Response;
    byte[] bytes = System.Text.Encoding.UTF8.GetBytes(error);
    
    response.Clear();
    response.AddHeader(ConttentLength, bytes.Length.ToString());
    response.ContentType = "application/json; charset=utf-8";
    response.OutputStream.Write(bytes, 0, bytes.Length);
    response.StatusCode = (int)HttpStatusCode.BadRequest;
    response.Flush();
    response.Close();
    Se tenia que hacer de esa manera porque se quiere reutilizar ese codigo en otros proyectos y no tener que retornar el JsonResult


    • Marcado como respuesta Jose Elias miércoles, 4 de marzo de 2015 20:41
    miércoles, 4 de marzo de 2015 20:40

Todas las respuestas

  • Hola, se pueden configurar los errores que querés que muestre tu aplicación. Mirate este enlace.

    Salu2

    miércoles, 4 de marzo de 2015 16:02
  • En lo personal no apoyo el uso de códigos de error de HTML para transmitir información de error personalizada.  ¿Recibió el usuario un HTTP 404 o 401 o 403 porque así lo dictó la lógica de la aplicación web, o porque IIS está mal configurado en alguna parte?  Como puede ver, es confuso.  Si necesita reportarle al usuario un problema de validación y quiere hacerlo en una página que únicamente muestre el mensaje de error, cargue un View cuyo modelo sea de tipo string donde el Model será el mensaje de error y listo.

    Jose R. MCP
    Code Samples


    • Editado webJose miércoles, 4 de marzo de 2015 16:13
    miércoles, 4 de marzo de 2015 16:11
  • Gracias Matías.

    El tema es que el mensaje es dinámico, el mensaje cambia dependiendo de cada validación que hago en el sistema.

    Las opcciones que vi que me enviastes lo que hacen es poner una página por defecto para los errores.

    Muchas gracias por ayudarme :)

    miércoles, 4 de marzo de 2015 16:12
  • Puedes controlar la respuesta ante las excepciones utilizando filtros de excepción. Dependiendo lo que quieras hacer puedes utilizar el filtro que viene implementado en MVC (HandleError) o crearte uno que se ajuste a tus necesidades.

    Exception Handling in ASP.NET MVC

    miércoles, 4 de marzo de 2015 16:26
  • hola

    que pasa si devuenves un HttpStatusCodeResult

    ASP.NET MVC 4, throw HttpException vs return HttpStatusCodeResult?

    en ese caso no serian un exception sino un result

    ----

    algo que no defines es que tipo de action defines, y como lo invocas

    lo invocas mediante ajax ? porque si es asi entonces podrias evaluar de devolver un HttpResponseMessage

    Exception Handling in ASP.NET Web API

    como se plantea por el final del articulo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    miércoles, 4 de marzo de 2015 16:36
  • Hay que distinguir entre la validación de los datos y las peticiones no autorizadas. En el primer caso los normal es señalar en la misma página los datos que son erróneos con sus correspondientes mensajes de error de validación.

    En cuanto a las peticiones no autorizadas hay que elegir el código HTTP correcto y tener en cuenta que cuando se devuelve un 401 Not Authorized la infraestructura de ASP.NET normalmente traduce el 401 en un 302 de redirección a página de login. Por eso para peticiones no autorizadas pero sí con sesión iniciada es preferible devolver un 403 Forbiden. Pero no es nada bueno devolver un 403 forbiden y un simple mensaje de error, hay que ser más diplomático con los usuarios y enseñarles una bonita página, en vez de una página con un simple mensaje. Para ello en la acción del controller establecemos la vista que queremos mostrar. Por ejemplo:

            public ActionResult MiAccion()
            {
                if (NoEstaAutorizado())
                {
                    this.Response.StatusCode = (int)System.Net.HttpStatusCode.Forbidden;
                    this.ViewBag.Mensaje = "No tiene permiso para realizar la operacion X";
                    return View("NoAutorizado");
                }
                return View("MiAccion");
            }


    miércoles, 4 de marzo de 2015 16:51
  • Con la excepción de asignar el Response.StatusCode, lo que dice Jesús es justamente lo que yo haría:  Un View para errores.

    Jose R. MCP
    Code Samples

    miércoles, 4 de marzo de 2015 16:55
  • Gracias Leandro.

    Yo estoy haciendo un llamado asincrónico con la libreria  de Jquery

     $.ajax({ ...... });

    del lado de mi controlador tengo

    [HttpPost]
    public JsonResult ProcesarArticuloConsumido( ...... )
    {
      try
      {
        ........
      }
      catch (Exception ex)
      {
        ........ 
      }
    
      return Json ( new {.......});
    }

    miércoles, 4 de marzo de 2015 17:41
  • hola

    es correcto puedes controlar el exception y convertir eso a un JsonResult

    o podrias controlar el error en el $.ajax

    return Json error from ASP.NET MVC

    como veras puedes definir un StatusCode en el Response para atrapar el error en $.ajax

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Jose Elias miércoles, 4 de marzo de 2015 20:34
    miércoles, 4 de marzo de 2015 18:53
  • tambien otra tecnica muy buena es usar un Filter

    ASP.NET MVC Ajax Error handling

    como veras decoras el action para que ante un error convierta el Exceptionen un mensaje de json puedas reconocer en el $.ajax

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 4 de marzo de 2015 18:54
  • Gracias.

    Me sirvió tu respuesta, solo la tuve que adaptar de la siguiente manera, pero me sirvieron tus comentarios. gracias

    string error = "MI MENSAJE DE ERROR EN FORMATO JSON";
    HttpResponse response = HttpContext.Current.Response;
    byte[] bytes = System.Text.Encoding.UTF8.GetBytes(error);
    
    response.Clear();
    response.AddHeader(ConttentLength, bytes.Length.ToString());
    response.ContentType = "application/json; charset=utf-8";
    response.OutputStream.Write(bytes, 0, bytes.Length);
    response.StatusCode = (int)HttpStatusCode.BadRequest;
    response.Flush();
    response.Close();
    Se tenia que hacer de esa manera porque se quiere reutilizar ese codigo en otros proyectos y no tener que retornar el JsonResult


    • Marcado como respuesta Jose Elias miércoles, 4 de marzo de 2015 20:41
    miércoles, 4 de marzo de 2015 20:40