已添加JsonRequestBehavior.AllowGet仍遇GET请求JSON返回错误求助
ASP.NET MVC GET请求返回Json仍报错的解决方案
明明在[HttpGet]标记的GetOrders方法中指定了JsonRequestBehavior.AllowGet,却依然收到禁止GET返回Json的错误,结合日志和代码,可从以下几个方向排查解决:
1. 检查过滤器是否拦截修改了JsonResult
项目中如果存在自定义ActionFilterAttribute或全局注册的过滤器,部分安全类过滤器会强制将JsonResult的JsonRequestBehavior重置为默认的DenyGet。比如类似这样的过滤器代码:
public class SecureJsonFilter : ActionFilterAttribute { public override void OnActionExecuted(ActionExecutedContext filterContext) { var jsonResult = filterContext.Result as JsonResult; if (jsonResult != null) { // 错误强制设置为DenyGet jsonResult.JsonRequestBehavior = JsonRequestBehavior.DenyGet; } } }
若存在此类过滤器,需修改逻辑,允许目标Action的GET请求返回Json。
2. 确认返回的JsonResult未被基类方法替换
如果控制器继承了自定义基类,且基类重写了Json方法,可能会忽略你传入的JsonRequestBehavior参数。比如基类中的重写:
public class BaseController : Controller { protected override JsonResult Json(object data) { // 未传入JsonRequestBehavior,默认使用DenyGet return base.Json(data); } }
这种情况可以直接在Action中实例化JsonResult,绕过基类方法:
[HttpGet] public JsonResult GetOrders() { var jsonResult = new JsonResult { Data = newList, JsonRequestBehavior = JsonRequestBehavior.AllowGet }; return jsonResult; }
3. 验证请求是否匹配目标Action
通过在GetOrders方法中添加断点或日志,确认请求确实进入了该方法。若路由配置存在冲突,请求可能被导向其他未设置AllowGet的Json返回Action,从而触发错误。
你提供的日志和代码
错误日志
To allow GET requests, set JsonRequestBehavior to AllowGet. [stackTrace] at System.Web.Mvc.JsonResult.ExecuteResult(ControllerContext context) at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass3_6.<BeginInvokeAction>b__4() at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass3_1.<BeginInvokeAction>b__1(IAsyncResult asyncResult) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End() at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) at System.Web.Mvc.Controller.<>c.<BeginExecuteCore>b__152_1(IAsyncResult asyncResult, ExecuteCoreState innerState) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End() at System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) at System.Web.Mvc.Controller.<>c.<BeginExecute>b__151_2(IAsyncResult asyncResult, Controller controller) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End() at System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) at System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) at System.Web.Mvc.MvcHandler.<>c.<BeginProcessRequest>b__20_1(IAsyncResult asyncResult, ProcessRequestState innerState) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End() at System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step) at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
相关代码
[HttpGet] public JsonResult GetOrders() { return Json(newList, JsonRequestBehavior.AllowGet); }
内容的提问来源于stack exchange,提问作者Learning
相关产品推荐
相关产品推荐

