MVC 4 - LogOff 控制器动作返回 404 未找到
MVC 4 - LogOff 控制器动作返回 404 未找到
我正在结束一个大学项目,不确定我是否盯着电脑太久,是否忽略了一些明显的东西,但是当我尝试注销用户时,URL /Account/LogOff 出现了404找不到的错误。
我有一个导航栏,根据用户是否已登录显示登录/登出选项:
在我的Account控制器中,有一个默认的LogOff操作,它是使用Internet模板自带的:
[HttpPost] [ValidateAntiForgeryToken] public ActionResult LogOff() { WebSecurity.Logout(); return View("Index"); }
有人可以告诉我为什么会发生这种情况-在我把笔记本扔到墙上之前。谢谢。
问题出现的原因是LogOff控制器操作在注销时返回404错误。解决方法是替换链接(锚标签)为以下代码:
@using (Html.BeginForm("Log Out", "Account", FormMethod.Post, new { id = "logoutForm" })) { @Html.AntiForgeryToken() Log Out }
这是一个非常好的解决方案,容易实现并解释了问题所在。感谢!
在我的一个传统应用程序中遇到了这个问题。我解决的方法是检测当提供的返回URL是'/Account/LogOff'时,采取相应的行动。
从'AccountController.cs'文件的'Login'方法中:
if (returnUrl == "/Account/LogOff") { return this.RedirectToLocal(null); } else { return this.RedirectToLocal(returnUrl); }
问题的原因是在MVC 4中,使用默认的MVC控制器行为时,如果尝试访问一个不存在的URL,将会返回一个404 Not Found错误。在这种情况下,当用户注销并尝试访问'/Account/LogOff'时,会发生此错误。
解决方法是在登录方法中对返回URL进行检查。如果返回URL是'/Account/LogOff',则重定向到一个空的本地URL('null'参数)。这将绕过控制器行为,防止返回404 Not Found错误。如果返回URL不是'/Account/LogOff',则将返回URL重定向到本地URL。
通过这种方式,我们可以正确处理注销操作,并避免404 Not Found错误。
问题的原因是LogOff控制器操作被限制为仅接受POST请求,但使用了一个链接(标签)来进行注销,这会导致当用户点击链接时发起HTTP GET请求。
解决方法有两种:
1. 将链接放入一个表单中并生成POST请求。
2. 从操作中移除[HttpPost]和[ValidateAntiForgeryToken]属性。
这两种方法都可以解决问题,但我的建议是移除HttpPost属性而不是创建一个表单来进行注销。因为在注销操作中没有向服务器提交任何数据,使用GET请求是最合适的。
移除ValidateAntiForgeryToken属性是因为它不适用于GET请求。
不要使用GET来进行注销,因为注销操作会修改服务器状态。
对于这个问题,没有一个正确的解决方案。只有在其他选项都不正确的情况下,才会有正确的解决方案。
x * x = 4 => x = 2, x = -2
这不是一个解决方案,而是一个变通方法。没有使用ValidateAntiForgeryToken属性,任何人都可以访问该GET请求。