我们有一个非常奇怪的问题,我们尚未能够诊断出来。我们的应用程序有许多特定的ASP.NET MVC操作失败,因为缺少必需的参数:
The parameters dictionary contains a null entry for parameter 'myVariable' of non-nullable type... etc
这些都是某种HTTP POST,因此我们希望看到表单数据。在某些情况下,应该有十几个变量。
我们使用ELMAH来收集Web应用程序中的错误,通过此工具,您通常可以看到在请求失败时发布的实际表单数据。但是在这些特定的errpr中,当应该存在多个变量时,整个表单都会丢失!
我们根本无法按需重现。但是,由于我们的应用程序中的流量很大,我们每天都会看到这些错误数十次。用户也无法重现错误,并且第二次在Web浏览器中尝试相同的操作。
我们也不能100%确定数据丢失的位置。是在网络浏览器中吗?在IIS管道里面?或者是ASP.NET MVC转储它?完全不确定。
如果有人可以帮助我们排查和/或诊断此问题,我们将不胜感激。
更新1:我们发现HTTP标头中指定的内容长度的大小表明请求中有一些内容。但是请求中的表单集合是空的(根据ELMAH)。因此,我们添加了一些额外的日志记录来跟踪收到的内容的实际长度和内容本身。
更新2:我们发现虽然CONTENT_LENGTH HTTP标头的大小正确(对于类似的请求),但内容本身却丢失了。该流包含0个字节。
我们也能够将问题缩小到Internet Explorer,我们似乎无法在其他浏览器中实现这一点。
我们有时能够通过在浏览器中导致多个重叠的AJAX请求重新创建问题,然后刷新或重定向。在完全写出流缓冲区之前,几乎就像Internet Explorer正在关闭连接一样。
我们无法用Fiddler来追踪这一点。使用Fiddler,似乎无法重新创建具体情况。
更新3:我们看到的所有内容都可以通过以下方式解释:Why does Internet Explorer not send HTTP post body on Ajax call after failure?
答案 0 :(得分:1)
这可能是一个猜测,但你的行为可能没有对它的[HttpPost]限制,所以不知何故用户通过GET而不是POST来获取它?
我的应用程序中有类似的事情,用户尝试POST到URL,但他们的FormsAuthentication票证已过期,因此他们被重定向到登录页面。但是因为登录页面传递了“ReturnUrl”参数,所以一旦登录它们就被重定向回到它们本来要发布到最初的页面,但这次是使用GET。这会导致您描述的错误,因为显然没有任何POST数据存在。正如我所说,有点猜测......
答案 1 :(得分:0)
您发布的错误消息似乎表单没有任何问题。对我来说,它看起来像一个路由问题,所以这就是我要问的问题:
答案 2 :(得分:0)
问题的根源可以解释为:Why does Internet Explorer not send HTTP post body on Ajax call after failure?
更新:事实证明,我们的具体症状似乎与使用jQuery有关。升级后,问题最终消失了。