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

JQuery Ajax调用返回HTML而非JSON:App Service问题排查

问题分析与解决方法

我编写了调用MVC后端方法的JQuery Ajax函数,但该调用返回HTML而非JSON字符串,解析返回内容时抛出错误。相同代码在其他App Service上可正常返回JSON,请问当前App Service存在什么问题?是否需要调整相关配置?

相关代码

MVC后端

[HttpPost]
[NoDirectAccess]
[ValidateAntiForgeryToken]
[Route("Login")]
public IActionResult Login(string email, string password)
{
  // 执行业务逻辑
  // 返回结果
  return Json(new { isValid = false, message = "", exception = "", html = "" });
}

JavaScript前端

$.ajax({
    url: '@Url.Action("Login","MyController")',
    type: 'POST',
    data: postData,
    contentType: 'application/x-www-form-urlencoded',
    dataType: "html",
    success: function (res) {
         console.log(JSON.parse(res)); // 此处抛出错误
    }
});

错误信息

VM466:6  Uncaught SyntaxError: Unexpected token '<', "
<!DOCTYPE "... is not valid JSON

从错误信息能看出,后端返回的是HTML文档(以<!DOCTYPE>开头)而非预期的JSON,说明请求没有命中目标方法,或是后端返回了错误页面。结合环境差异,可能的原因及解决办法如下:

  • 防伪令牌验证失败
    后端方法添加了[ValidateAntiForgeryToken]注解,如果前端请求未携带正确的防伪令牌,后端会直接返回400错误的HTML页面,而非JSON。

    • 检查postData中是否包含__RequestVerificationToken字段,该值需从页面中@Html.AntiForgeryToken()生成的隐藏域获取。
    • 对比其他正常App Service,确认当前环境是否开启了更严格的Cookie策略,导致令牌无法正常传递。
  • 路由匹配错误
    后端使用[Route("Login")]定义路由,前端通过@Url.Action("Login","MyController")生成URL,可能当前App Service的全局路由配置(如路由前缀、控制器路由规则)与其他环境不同,导致请求未命中Login方法,返回了404 HTML页面。

    • 打开浏览器开发者工具的Network面板,查看请求的实际URL,确认是否与后端路由匹配。
    • 可尝试硬编码URL(如/MyController/Login)测试,验证是否能返回正确JSON。
  • 自定义错误页面配置
    当前App Service可能开启了自定义错误页面,当后端方法抛出异常时,会返回HTML错误页而非JSON。其他环境可能关闭了该配置,直接返回异常信息。

    • 在Azure门户的App Service → 配置 → 常规设置中,查看“错误页面”是否设置为“自定义”,若为是,可改为“关闭”,或调整错误处理逻辑,让API请求返回JSON格式错误。
    • 也可在ASP.NET Core的Program.cs中修改错误处理中间件:
      app.UseExceptionHandler(errorApp =>
      {
          errorApp.Run(async context =>
          {
              context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
              context.Response.ContentType = "application/json";
              var exceptionFeature = context.Features.Get<IExceptionHandlerPathFeature>();
              await context.Response.WriteAsync(System.Text.Json.JsonSerializer.Serialize(new { 
                  isValid = false, 
                  message = "服务器错误", 
                  exception = exceptionFeature?.Exception.Message 
              }));
          });
      });
      
  • 前端dataType设置矛盾
    前端Ajax设置dataType: "html",但后端返回的是JSON,虽然其他环境能正常解析,但当前环境因返回HTML错误页导致解析失败。建议修改dataType为"json",让jQuery自动解析JSON,同时新增error回调方便排查问题:

    $.ajax({
        url: '@Url.Action("Login","MyController")',
        type: 'POST',
        data: postData,
        contentType: 'application/x-www-form-urlencoded',
        dataType: "json",
        success: function (res) {
             console.log(res);
        },
        error: function(xhr){
            console.log(xhr.responseText); // 查看返回的HTML内容,定位具体错误
        }
    });
    

内容的提问来源于stack exchange,提问作者chosenOne Thabs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 19:45:25