ASP.NET使用JS实现自动注销时提示Logout资源不存在404错误如何解决
问题原因
- 你给
LogoutAction添加了[HttpPost]特性,该接口仅接收POST类型的请求,但你在JS中使用window.location.href跳转属于GET请求,无法匹配到对应Action,因此返回404 - 你调用
@Url.Action时传参错误:该方法第三个参数为路由值对象,传入FormMethod.Post不仅不能指定请求方式,反而会导致生成的URL携带异常参数,进一步影响请求匹配
解决方案
方案1:修改Action允许GET请求(适配自动跳转场景)
直接移除[HttpPost]特性,或额外添加[HttpGet]特性即可:
[Authorize] [HttpGet] public ActionResult Logout() { Session.Clear(); FormsAuthentication.SignOut(); return RedirectToAction("Index", "Home"); }
同时修正JS代码里Url.Action的调用:
<script type="text/javascript"> window.setTimeout(function(){ window.location.href = '@Url.Action("Logout", "Home")'; }, 5000); </script>
方案2:保留[HttpPost]限制,JS改为发送POST请求(安全性更高)
如果需要保留POST限制降低CSRF风险,可以用动态提交表单的方式发起请求:
<script type="text/javascript"> window.setTimeout(function(){ const form = document.createElement('form'); form.method = 'post'; form.action = '@Url.Action("Logout", "Home")'; // 如果开启了防伪校验,可添加下面这行注入防伪令牌 // form.innerHTML += '@Html.AntiForgeryToken()'; document.body.appendChild(form); form.submit(); }, 5000); </script>
内容的提问来源于stack exchange,提问作者Ronith Roy
相关产品推荐
相关产品推荐

