我最初问过this question,这表明我看到了缺少POST值的MVC错误。我无法重现 - 我仍然无法按需复制它,但我确实在IE11上自己得到了错误,我得到了一个线索......
我在IIS7.5中有一个仅使用基本身份验证运行的应用程序。我查看Fiddler,通常所有交易都按预期Authorization: Basic xxxxx
。正文包含预期的POST值,Content-Length
是正确的。
当我遇到这个问题时,我发现每个请求(GET和POST,包括静态内容)现在都在Fiddler中显示Authorization: Negotiate xxxxx
,空体和零Content-Length
,即使我通过jQuery AJAX提交了一个POST对象,IE的开发工具显示了真正的POST主体(这当然意味着IE正在撒谎 - 这不是第一次)。它获得401响应,然后使用Basic
发出新请求,但也有一个空POST主体,这意味着ASP.NET会抛出有关缺少参数值的错误。
同一顶级域名上的其他Web应用程序使用Windows身份验证而不是Basic,我怀疑用户是否访问其中一个站点,IE变得困惑,认为我的应用程序也应该使用Windows身份验证 - 但我每次都无法重现。我已经复制了两次,但是在十几次左右的时间里一遍又一遍地做同样的事情,所以我没有找到办法让它每次都重现。
我不知道为什么POST机构会被清空,即使它确实切换并尝试使用WinAuth而不是基本 - 但问题发生的时候就是这样,所以我是确定它是相关的。
有关如何防止IE混淆和使用Negotiate
的任何想法,或者至少如何检测并优雅地在服务器上处理此问题?我只在IE中看过它,但我不能确定它只是IE浏览器。
这是普通POST的样子:
然后问题开始后,完全相同的POST看起来像:
修改
这是一个有趣的编辑 - 我刚看到一个新的症状。这一次,所有GET请求都没有Authorization
标头,响应返回401基本,GET用basic重新完成。但是POST正常进行,第一次尝试是基本的。我不知道发生了什么事情,但它也是同一问题的类似症状。