2

简短的问题:为什么 safari 会导致我的 MVC3 Web 应用程序出错 - Request.Form 由于某种原因是空白的?

详细问题:每次出现未捕获的异常时,我的 MVC3 网站都会向我发送一封电子邮件。我使用这些来快速查找和修复错误,电子邮件包含异常、堆栈跟踪、用户的 IP 地址、用户代理字符串以及可能已发布的任何表单值。

最近我注意到一些已被证明难以追踪的错误,我想我会在这里发布我的发现,希望它们能帮助其他人。

最初的症状是这些错误:System.Web.Mvc.HttpAntiForgeryException:未提供所需的防伪令牌或无效。

我的表单操作引发了错误,我无法弄清楚任何人如何使页面进入没有 __RequestVerificationToken 隐藏字段或其他表单字段的状态。

所以我花了很长时间研究 cookie 以及令牌的工作原理,最终只是删除了我的 ActionResult 上的 [ValidateAntiForgeryToken] 属性以查看它是如何进行的 - 但我仍然遇到错误。

然后我注意到用户代理字符串显示只有 Safari 5.1.7 导致了这个问题。

4

2 回答 2

4

对于那些像我一样即使使用该[HttpPost]属性也遇到此问题的人,我已经找到了解决方案。

http://forums.iis.net/t/1182376.aspx/1

IIS 上的那个线程描述了Negotiate(即Kerberos)身份验证在 Safari 中处理不当。您必须禁用Negotiate作为提供者。

在 IIS(我使用的是 IIS 7.5)中,点击您的站点,然后Authentication(双击)→ Windows Authentication(单击)→ Providers(在右侧)→Remove Negotiate and leave NTLM

这解决了我在 Safari 上的所有问题。

于 2013-04-10T12:42:57.737 回答
2

简短回答:不要忘记添加 [HttpPost] 属性!!!

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult PageSubmit() {

更长的答案:Safari 有一个功能,可以在墙式屏幕上显示您访问过的“热门网站”。在我的网站上,虽然我有多个页面,但它们都提交给相同的表单操作。这使得表单操作“非常受欢迎”,并出现在热门网站上。

然后人们可以单击该站点,该站点正在执行直接 GET 到我的处理页面,没有表单变量,并导致错误。

我添加了 [HttpPost] 属性,如果单击它,现在它是 404。

以下是有关预览功能的一些额外信息:Safari Top Sites Preview看来您可以检查服务器变量:

Request.ServerVariables["HTTP_X_PURPOSE"] == "preview"

您也可以进行 javascript 检查:

window.navigator&&window.navigator.loadPurpose==="preview"

我希望这可以节省一些时间。

于 2013-02-22T05:22:05.753 回答