.NET Core 3.1升级至6.0后Web应用Ajax请求异常问题
解决.NET Core 3.1升级到6.0后Ajax POST请求返回页面HTML的问题
刚踩过一模一样的升级坑,结合你的代码来看,问题大概率出在防伪令牌验证或者路由配置变化上,咱们一步步来排查解决:
一、最常见原因:防伪令牌验证拦截了请求
.NET 6对POST请求的防伪验证做了默认强化,如果你没在Ajax请求里携带防伪令牌,服务器会直接拦截请求,重定向到默认页面(这就是你看到返回当前页面HTML的核心原因)。
解决步骤:
- 在你的视图页面(比如_Layout.cshtml或者当前业务页面)中添加防伪令牌的元标签:
@inject IAntiforgery Antiforgery @{ var antiforgeryToken = Antiforgery.GetAndStoreTokens(Context).RequestToken; } <meta name="request-verification-token" content="@antiforgeryToken" />
- 修改你的Ajax请求,把令牌加到请求头中:
$.ajax({ type: 'POST', url: "/Home/SamplePostCall", // 添加防伪令牌头 headers: { "RequestVerificationToken": $('meta[name="request-verification-token"]').attr('content') }, data: { PostData: "Sample Post Data" }, success: function(response) { console.log(response); }, error: function(err){ console.log(err); } });
二、检查.NET 6的路由配置是否正确
.NET 6的Program.cs启动配置和3.1差异很大,如果你沿用旧的UseMvc配置,可能导致控制器路由无法匹配,请求最终落到默认页面路由上。
检查Program.cs中的路由配置:
确保有以下代码(通常在app.UseAuthorization();之后):
// 默认路由配置 app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); // 如果你的控制器用了属性路由(比如[Route("[controller]/[action]")]),还要加上: // app.MapControllers();
三、额外排查点
- 打开浏览器开发者工具的Network标签,查看该Ajax请求的状态码:如果是
302 Found,那100%是防伪令牌的问题;如果是404 Not Found,则是路由配置问题。 - 确认你的控制器类上没有添加错误的
[Route]属性,导致URL匹配错误。
按上面的步骤调整后,你的Ajax请求应该就能正常到达控制器并返回JSON数据了。
内容的提问来源于stack exchange,提问作者Adil Dhada
相关产品推荐
相关产品推荐

