net ihttpactionresult httpresponseexception handling example error badrequest bad asp asp.net asp.net-mvc

ihttpactionresult - asp.net mvc[handleerror][autorizar] con JsonResult?



web api global exception handling (1)

Usted no En este momento, no ayudan con JSON. Sin embargo:

Me doy cuenta de que puedo crear mis propios atributos [HandleJsonError] y [AuthorizeJson] que devuelven JsonResults en lugar de ViewResults, pero luego tendré que ubicarlos en cualquier método que devuelva Json, y preocuparme por el orden del filtro, etc.

Lo que hicimos es subtitular los atributos existentes y hacer que funcionen de manera condicional:

public sealed class AjaxAuthorizeAttribute : AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { base.OnAuthorization(filterContext); if (filterContext.Result == null) { return; } else if (filterContext.Result.GetType() == typeof(HttpUnauthorizedResult) && filterContext.HttpContext.Request.IsAjaxRequest()) { filterContext.Result = new ContentResult(); filterContext.HttpContext.Response.StatusCode = 403; } } }

Ahora el código JS puede buscar 403 (porque ASP.NET se come 401 y devuelve la página de error) y el mismo atributo funciona para Ajax y no Ajax. Así que no hay problemas de orden de filtro.

¿Cuál es una forma elegante de aprovechar los atributos existentes de [HandleError] y [Authorize] cuando se trata de llamadas XHR desde javascript?

Entonces, digamos por ejemplo un método GetJson que devuelve un JsonResult.

Cuando se produce un error, el método [HandleError] devolverá un ViewResult que se recuperará en la función de devolución de llamada en javascript.

Luego tendría que colocar un código personalizado en cualquier lugar en javascript para manejar y redirigir cualquier fallo, etc.

Lo que me gustaría hacer es que el atributo [HandleError] devuelva un JsonResult si la acción original tenía previsto hacerlo. Esto podría ser una ilusión de mi parte.

De manera similar, si entra una solicitud Json no autorizada, en lugar de devolver un nuevo HttpUnauthorizedResult, me gustaría devolver un JsonResult que permite que el código del lado de mi cliente maneje las cosas de una manera común.

¿Estoy ladrando el árbol equivocado aquí? Tal vez hay una forma aún mejor que MVC puede manejar esto que no conozco?

¿Cómo están manejando este escenario otras personas?

Gracias.

PD: Me doy cuenta de que puedo crear mis propios atributos [HandleJsonError] y [AuthorizeJson] que devuelven JsonResults en lugar de ViewResults, pero luego tendré que ubicarlos en cualquier método que devuelva Json, y preocuparme por el orden del filtro, etc. Seguro que sería bueno si pudiera usar la reflexión o algo para que el mismo atributo actúe de manera diferente dependiendo de la firma del método original.