OnActionExecuting 事件未返回 jsonResult
jsonResult not returned by OnActionExecuting event
我创建了一个 ActionFilterAttribute,用于在允许处理 MVC 控制器 get/post 请求之前验证帐户是否可用于处理。如果该帐户不可用,我想 return 给客户一个错误。如果请求是 ajax post 我想在响应中包含 json 数据。出于某种原因,当浏览器和网站 运行 在同一台机器上时,json 数据只会 return 发送到浏览器。如果我在另一台机器上浏览网站并执行 ajax post 响应内容类型 returned 为 "text/html"。但是,如果浏览器 运行 与网站位于同一台计算机上,则响应 Content-Type 会被正确地 return 编辑为 "application/json"。
我做错了什么?
ActionFilterAttribute
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
if (filterContext.Result == null)
{
if (IsAccountUnavailable(Key))
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.Conflict;
filterContext.HttpContext.Response.ContentType = "application/json";
filterContext.Result = new JsonResult
{
Data = new {Error = "Unavailable", Url = GetLogOffUrl()},
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
else
filterContext.Result = new RedirectResult(GetLogOffUrl());
}
}
}
jQuery ajax post
$.ajax({
url: window.location.href,
type: 'POST',
data: JSON.stringify(ko.mapping.toJS(serverModel.SelectionsViewModel)),
contentType: "application/json; charset=utf-8",
dataType: 'json'
})
.done(function (data) {
if (data.isValid)
window.location.href = serverModel.NextView();
else
showGenericSaveError();
})
.fail(function (jqXhr) {
handleAjaxError(jqXhr);
});
};
感谢发现以下问题的同事 post 我的问题已经解决。我需要设置 Response.TrySkipIisCustomErrors = true
工作代码...
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
if (filterContext.Result == null)
{
if (QuoteServiceLayer.IsAccountUnavailable(AccountKey, EnrollmentPeriodType, EmployeeKey))
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.Conflict;
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
filterContext.Result = new JsonResult
{
Data = new {Error = "Unavailable", Url = GetLogOffUrl()},
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
else
filterContext.Result = new RedirectResult(GetLogOffUrl());
}
}
}
我创建了一个 ActionFilterAttribute,用于在允许处理 MVC 控制器 get/post 请求之前验证帐户是否可用于处理。如果该帐户不可用,我想 return 给客户一个错误。如果请求是 ajax post 我想在响应中包含 json 数据。出于某种原因,当浏览器和网站 运行 在同一台机器上时,json 数据只会 return 发送到浏览器。如果我在另一台机器上浏览网站并执行 ajax post 响应内容类型 returned 为 "text/html"。但是,如果浏览器 运行 与网站位于同一台计算机上,则响应 Content-Type 会被正确地 return 编辑为 "application/json"。
我做错了什么?
ActionFilterAttribute
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
if (filterContext.Result == null)
{
if (IsAccountUnavailable(Key))
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.Conflict;
filterContext.HttpContext.Response.ContentType = "application/json";
filterContext.Result = new JsonResult
{
Data = new {Error = "Unavailable", Url = GetLogOffUrl()},
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
else
filterContext.Result = new RedirectResult(GetLogOffUrl());
}
}
}
jQuery ajax post
$.ajax({
url: window.location.href,
type: 'POST',
data: JSON.stringify(ko.mapping.toJS(serverModel.SelectionsViewModel)),
contentType: "application/json; charset=utf-8",
dataType: 'json'
})
.done(function (data) {
if (data.isValid)
window.location.href = serverModel.NextView();
else
showGenericSaveError();
})
.fail(function (jqXhr) {
handleAjaxError(jqXhr);
});
};
感谢发现以下问题的同事 post 我的问题已经解决。我需要设置 Response.TrySkipIisCustomErrors = true
工作代码...
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
if (filterContext.Result == null)
{
if (QuoteServiceLayer.IsAccountUnavailable(AccountKey, EnrollmentPeriodType, EmployeeKey))
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.Conflict;
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
filterContext.Result = new JsonResult
{
Data = new {Error = "Unavailable", Url = GetLogOffUrl()},
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
else
filterContext.Result = new RedirectResult(GetLogOffUrl());
}
}
}