You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ajax调用需成功返回HTML、错误返回字符串,部署后错误返回HTML如何解决?

解决Ajax成功返回HTML、错误返回字符串的跨环境问题

这个问题我之前在部署MVC项目到IIS时也碰到过,核心原因是生产环境的服务器(比如IIS)会自动拦截500状态码的响应,替换成预设的错误HTML页面,而不是你控制器返回的JSON错误信息。本地调试时没有这个拦截,所以能正常拿到错误字符串。下面给你两个可行的解决方案:

方案1:阻止IIS替换自定义错误响应(改动最小)

这个方案不需要修改Ajax的成功逻辑,只需要调整控制器的异常处理和服务器配置:

步骤1:修改控制器的异常捕获代码

在catch块里添加Response.TrySkipIisCustomErrors = true;,告诉IIS不要替换我们返回的错误响应:

catch (Exception e) { 
    log.Error(e); 
    string error;
    if (e.Message.Contains("Is not a valid cause category.")) 
        error = "The selected category is not a valid category. Please choose another category."; 
    else 
        error = "You cannot take this type of action."; 
    Response.StatusCode = 500;
    // 关键:让IIS跳过自定义错误页面,保留我们的JSON响应
    Response.TrySkipIisCustomErrors = true;
    return Json(error); 
}

步骤2:调整Ajax的错误回调解析逻辑

因为你设置的dataType是html,但错误时返回的是JSON字符串,所以需要在错误回调里尝试解析:

error: function (response) {
    debugger;
    $("#dashSpinner").hide();
    let errorText = response.responseText;
    try {
        // 尝试把响应文本解析为JSON(控制器返回的是JSON格式的错误字符串)
        const errorObj = JSON.parse(errorText);
        errorText = errorObj;
    } catch (parseError) {
        // 如果解析失败,说明是服务器的默认错误页面,用兜底提示
        errorText = "An unexpected server error occurred. Please try again later.";
    }
    swal({ 
        title: "Error", 
        text: errorText, 
        type: "error", 
        showConfirmButton: true 
    }); 
}

可选:配置web.config确保生效

如果上面的代码还不生效,可以在web.config里添加以下配置,强制IIS保留原始响应:

<system.webServer>
  <httpErrors existingResponse="PassThrough" />
</system.webServer>

方案2:统一返回JSON格式(更稳妥,避免服务器拦截)

这个方案会改变返回结构,成功时把HTML放到JSON对象里,错误时返回错误标记,彻底避开服务器的500状态码拦截:

步骤1:修改控制器的返回逻辑

添加一个辅助方法用来渲染PartialView为字符串,然后统一返回JSON对象:

// 辅助方法:把PartialView渲染成HTML字符串
protected string RenderPartialViewToString(string viewName, object model)
{
    ViewData.Model = model;
    using (var sw = new StringWriter())
    {
        var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
        var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
        viewResult.View.Render(viewContext, sw);
        viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View);
        return sw.GetStringBuilder().ToString();
    }
}

// 你的Actions方法
public ActionResult _Actions()
{
    try
    {
        // 业务逻辑:获取模型数据
        var model = GetYourModelData();
        // 渲染PartialView为HTML字符串
        var htmlContent = RenderPartialViewToString("YourPartialViewName", model);
        // 返回成功标记+HTML内容
        return Json(new { success = true, html = htmlContent }, JsonRequestBehavior.AllowGet);
    }
    catch (Exception e)
    {
        log.Error(e);
        string error;
        if (e.Message.Contains("Is not a valid cause category.")) 
            error = "The selected category is not a valid category. Please choose another category."; 
        else 
            error = "You cannot take this type of action."; 
        // 返回失败标记+错误信息(状态码默认200,不会被服务器拦截)
        return Json(new { success = false, message = error }, JsonRequestBehavior.AllowGet);
    }
}

步骤2:修改Ajax调用逻辑

把dataType改成json,然后在success回调里判断是成功还是错误:

$.ajax({ 
    type: "post", 
    dataType: "json", 
    url: '@Url.Content("~/RBA/Tools/_Actions")', 
    data: $("#actionForm").serialize(), 
    success: function (response) { 
        debugger;
        $("#dashSpinner").hide();
        if (response.success) {
            // 成功:渲染HTML内容
            $("#DetailsEdit").removeClass('zoomInDown'); 
            $("#DetailsEdit").addClass('flipInX'); 
            $("#DetailsRefresh").html(response.html); 
            $("#actionPlaceholder").hide(); 
        } else {
            // 错误:显示SweetAlert弹窗
            swal({ 
                title: "Error", 
                text: response.message, 
                type: "error", 
                showConfirmButton: true 
            });
        }
    }, 
    error: function (response) { 
        debugger; 
        $("#dashSpinner").hide(); 
        // 捕获真正的服务器异常(比如网络错误、500未被处理的情况)
        swal({ 
            title: "Error", 
            text: "An unexpected server error occurred.", 
            type: "error", 
            showConfirmButton: true 
        }); 
    } 
});

方案选择建议

  • 如果不想改动太多现有代码,优先选方案1,只需要加一行代码和调整错误回调解析;
  • 如果想彻底避免服务器错误页面的干扰,或者生产环境的服务器配置无法修改,选方案2,结构更清晰,兼容性更好。

内容的提问来源于stack exchange,提问作者Fast Chip

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:02:40