我在网站上看到一个间歇性的问题。当我的表单方法为GET
时,有些用户会尝试通过POST
提交表单。错误总是来自IE用户。我注意到一些UA字符串引用了“yie8”,我假设它是Yahoo的IE8包。我认为雅虎!工具栏可能有些东西反对我,但我无法在安装工具栏的IE7上复制问题。问题不仅发生在这个表单上,还发生在其他各种表单上,其中许多是使用jQuery 表单插件 load()函数通过Ajax提交的,并传递了一个对象参数。这个例子不是其中之一。
一个简单的解决方法就是取出我的所有AcceptVerb()
属性,但这完全是蹩脚的。有没有人遇到这样的事情或有任何处理它的想法?
这是一个示例异常日志条目。
We've got a Web problem! Exception thrown:
http://my.web.site/User.mvc/ResetPassword
Method: GET
User: <not logged in>
UserAgent: IE 7 (Mozilla/4.0 (compatible; MSIE 7.0;Windows NT 5.1;.NET CLR 1.1.4322;.NET CLR 2.0.50727;.NET CLR 3.0.04506.30))
Exception: System.Web.HttpException
Message: A public action method 'ResetPassword' could not be found on controller 'MyApp.Controllers.UserController'.
这是呈现给浏览器的HTML。
<form action="/User.mvc/ResetPassword" class="standard-form small-form" method="post">
<fieldset>
<div class="row">
<label for="usernameTextBox">User Name</label>
<input type="text" name="username" id="usernameTextBox" />
</div>
<div class="row">
<label for="emailTextBox">Email Address</label>
<input type="text" name="email" id="emailTextBox" />
</div>
<div class="row">
<label> </label>
<input type="submit" value="Reset Password" />
</div>
</fieldset>
</form>
这是我的ResetPassword行动的签名。
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult ResetPassword(string username, string email)
(是的,电子邮件地址必须与我们存档的地址相匹配)
答案 0 :(得分:1)
我认为你无能为力。某些浏览器插件/工具栏具有允许从GET更改表单的功能 - &gt; POST,反之亦然。
如果您的用户这样做,那么您无能为力。
答案 1 :(得分:1)
当网站访问者行为不当时,你必须问自己:“这是一个合理误解的可能性有多大?”在我看来,使用错误的HTTP方法不是浏览器所做的事情,因为它是旧的或错误的或其他什么。这是一个无效的请求,所以发送给他们405并完成它。
(我听说有些浏览器和插件尝试“预加载”可从当前页面访问的页面,但这是一个蹩脚的'功能'。我的答案仍然是将其视为无效请求。)
答案 2 :(得分:1)
可能答案提出的问题多于实际答案,但本着帮助......的精神。
在GET调用中,实际提供的是“username”和“email”查询字符串参数吗? (您的IIS日志文件可能正在记录查询字符串,因此请检查)。如果是这样,那么Ben S的答案可能适用。
如果您的网站面向互联网,那么这些电话可能只是蜘蛛不能很好地播放。
如果您的网站是内部网站,我怀疑用户正在玩“刷新”。
您是否跟踪了引发这些错误的客户端IP地址?
答案 3 :(得分:0)
我说这不是你的问题。您将网站设计为按预期工作,将GET / POST限制放在方法上(出于安全或其他原因)。
如果用户尝试使用某些高级工具/插件(例如GET / POST开关)来解决您的安全问题,那么您不必担心。但是,您可能希望添加一些自定义错误页面来处理这些方案并相应地警告用户。