简短的问题:为什么在一个Action中包含额外的异常文本,当它们都以通用的方式处理时,应该防止它?
解释:我有一些通用的错误处理代码在我的mvc.net 4应用程序。任何未处理的异常都会被记录下来,并作为结果的一部分返回一条通用消息。我通过创建一个覆盖OnException的基控制器类来做到这一点。它看起来像这样。
protected override void OnException(ExceptionContext filterContext){
...//Some logging stuff
filterContext.ExceptionHandled = true;
Response.StatusCode = (int)HttpStatusCode.BadRequest;
filterContext.Result = new JsonResult
{
Data = new { Message = "An error has occured. If you continue to experience this issue, please contact an administrator.", success = false },
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
应该返回一个JSON对象,其中包含一个通用的错误消息。responseText看起来像
"{ Message = "An error has occured. If you continue to experience this issue, please contact an administrator.", success = false }"
当该消息返回时,它由一个泛型javascript函数处理:
function HandleServerError(response) {
var message = JSON.parse(response.responseText).Message;
ShowMessage(message, true);
HideProgress();
}
在大多数情况下,这可以很好地工作。例如,我有一个方法,它使用ajax在服务器上保存一些数据,并接收JSON消息作为返回。function ChangeSecurityStatus(securityID, isActive) {
ShowProgress();
$.ajax({
url: "SetSecurityIsActiveStatus",
data: { "securityID": securityID, "isActive": isActive },
type: "POST",
success: function (result) {
ShowMessage(result.Message);
HideProgress();
}
});
}
SetSecurityIsActiveStatus是一个JsonResult,当前被设置为自动抛出一个带有消息"Its Broken!"的异常。当它失败时,它将进入通用错误处理程序客户端。
还有另一个ajax调用似乎工作方式不同。它看起来像这样:
function SetStatus(action, id, status) {
ShowProgress();
$.ajax({
url: "SetSecurityContentIsActiveStatus",
type: "POST",
data: { "id": id, "status": status },
success: function (result) {
if (result)
ShowMessage("Action is successfully saved.");
else
ShowMessage("There is an issue saving your action.", true);
},
complete: function (request, textStatus) {
HideProgress();
}
});
}
SetSecurityContentIsActiveStatus是一个JsonResult,当前设置为自动抛出一个异常消息"Its Broken!"当我发出这个请求时,我得到的响应是这个
"Its Broken!{ Message = "An error has occured. If you continue to experience this issue, please contact an administrator.", success = false }"
这不是一个有效的json字符串,当我调用json .parse时抛出错误。它正确地通过OnException覆盖运行,通用消息被传递给客户端,但实际的异常也被传递。
我真的不能告诉两个ajax调用之间的区别,为什么他们会返回不同的结果。
问题是其中一个控制器有一个处理错误的自定义属性。它将在我的基本控制器上处理错误,因此两个消息都被传递。