ejemplos - ASP.NET MVC 2.0 JsonRequestBehavior Configuración global
web forms c# ejemplos (6)
ASP.NET MVC 2.0 ahora arrojará una excepción de forma predeterminada cuando una acción intente devolver JSON en respuesta a una solicitud GET. Sé que esto se puede anular método por método usando JsonRequestBehavior.AllowGet, pero ¿es posible establecer en un controlador o superior (posiblemente el web.config)?
Actualización: por comentario de Levi, esto es lo que terminé usando-
protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding)
{
return Json(data, contentType, JsonRequestBehavior.AllowGet);
}
¿Este es el problema de seguridad que MVC2 intentaba abordar? http://haacked.com/archive/2009/06/25/json-hijacking.aspx
Si es así, parece que la vulnerabilidad solo es un problema si está intentando hacer una llamada JSON a un sitio web externo. Si su aplicación MVC2 solo hace llamadas json a su propio sitio web (para llenar jqgrids, por ejemplo), ¿no debería poder anular de manera segura la llamada Json en su controlador base para permitir siempre obtener?
Esto, al igual que otras configuraciones específicas de MVC, no se puede configurar a través de Web.config. Pero tienes dos opciones:
Reemplazar la sobrecarga del Controlador.Json (objeto, cadena, Codificación) para llamar a Json (objeto, cadena, Codificación, JsonRequestBehavior), pasando JsonRequestBehavior.AllowGet como último argumento. Si desea que esto se aplique a todos los controladores, haga esto dentro de una clase de controlador de base abstracta, luego tenga todos los controladores subclase de esa clase abstracta.
Cree un método de extensión MyJson (este Controlador, ...) que crea un JsonResult y establece las propiedades apropiadas, luego llámelo desde su controlador a través de este. MyJson (...).
Hay otra opción. Use filtros de acción.
Cree un nuevo ActionFilterAttribute, aplíquelo a su controlador o una acción específica (según sus necesidades). Esto debería ser suficiente:
public class JsonRequestBehaviorAttribute : ActionFilterAttribute
{
private JsonRequestBehavior Behavior { get; set; }
public JsonRequestBehaviorAttribute()
{
Behavior = JsonRequestBehavior.AllowGet;
}
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
var result = filterContext.Result as JsonResult;
if (result != null)
{
result.JsonRequestBehavior = Behavior;
}
}
}
Luego, aplícalo así:
[JsonRequestBehavior]
public class Upload2Controller : Controller
MVC 2 bloquea Json para solicitudes GET por razones de seguridad. Si desea anular ese comportamiento, revise la sobrecarga de Json que acepta un parámetro JsonRequestBehavior.
public ActionResult Index()
{
return Json(data, JsonRequestBehavior.AllowGet)
}
Solo cambia el código JSON de:
$.getJson("methodname/" + ID, null, function (data, textStatus)
a:
$.post("methodname/" + ID, null, function (data, textStatus)
También recibí este error cuando uso por primera vez MVC 2.0 usando mi código anterior en MVC 1.0. Yo uso el violín para identificar la causa del error. Vea los pasos sobre cómo solucionarlo usando Fidder -