【问题标题】:Why is the exception message being return to the client when I override it为什么在我覆盖它时将异常消息返回给客户端
【发布时间】:2026-01-30 17:55:02
【问题描述】:

简短的问题:为什么在一个操作中包含额外的异常文本,而它们都以应该防止它的通用方式处理?

说明:我的 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 覆盖,通用消息被传递给客户端,但实际异常也被传递。

我真的无法区分这 2 个 ajax 调用之间的区别以及为什么它们会返回不同的结果。

【问题讨论】:

  • 您是如何调用 DoSomething() 操作方法的?阿贾克斯?
  • 是的,使用 jquery ajax。我可能需要发布更多详细信息或更改问题,因为我可能没有正确描述问题。
  • 实际上我已经尝试过上述场景,但在这两种情况下它都只返回有效的 json reslut
  • 是的,我认为这可能与 ActionResult 没有任何关系。我要换个问题

标签: asp.net-mvc exception-handling actionresult


【解决方案1】:

问题在于其中一个控制器具有处理错误的自定义属性。它会在我的基本控制器上处理错误,所以两条消息都被传递了。

【讨论】:

    最近更新 更多