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

