POST请求中丢失HTML表单数据

4
我们遇到了一个非常奇怪的问题,我们还没有能够诊断出来。我们的应用程序有许多特定的ASP.NET MVC操作失败,因为缺少必需的参数:
The parameters dictionary contains a null entry for parameter 'myVariable' of non-nullable type... etc

每个请求都是HTTP POST,因此我们期望看到表单数据。在某些情况下,应该有十几个变量。
我们使用ELMAH收集Web应用程序中的错误,并通过此工具通常可以查看请求失败时发布的实际表单数据。但是,在这些特定的错误中,当应该有多个变量时,整个表单都不见了!
我们无法按需重现此问题。但是,由于我们的应用程序中的流量很大,因此我们每天会看到这些错误数十次。用户也无法重现该错误,并且在Web浏览器中尝试相同的操作第二次可以正常工作。
我们也不确定数据丢失的位置。它是否在Web浏览器中?在IIS管道内部?还是ASP.NET MVC将其转储?完全不确定。
如果有人能帮助我们排除故障和/或诊断此问题,我们将不胜感激。
更新1:我们发现HTTP标头中指定的内容长度大小表明请求中有一些内容。但是,请求的表单集合为空(根据ELMAH)。因此,我们添加了一些额外的日志记录,以跟踪接收到的实际内容长度和内容本身。
更新2:我们发现虽然CONTENT_LENGTH HTTP头的大小是正确的(对于类似的请求),但内容本身确实缺失。流中不包含任何字节。
我们还能够将问题缩小到Internet Explorer,我们似乎无法在其他浏览器中出现这种情况。
我们有时可以通过在浏览器中引起多个重叠的AJAX请求,然后刷新或重定向来重新创建问题。几乎可以认为Internet Explorer在完全写出流缓冲区之前关闭了连接。
我们无法使用Fiddler跟踪此问题。使用Fiddler,似乎无法重新创建特定情况。
更新3:我们所看到的一切都可以通过这个解释:为什么Internet Explorer在Ajax调用失败后不发送HTTP post body?

这听起来像是一个机器人正在攻击你的网站。 - John Farrell
它们不是机器人,它们是经过身份验证的用户(我们可以通过 cookie 来确定)。用户在出现错误时会抱怨,我们将其追溯到这些错误。 - Joseph Daigle
3个回答

1

这可能只是一个猜测,但您的操作是否没有[HttpPost]限制,以至于某些用户通过GET而不是POST访问它?

我在我的应用程序中遇到过类似的情况,用户尝试将POST发送到URL,但他们的FormsAuthentication票证已过期,因此他们被重定向到登录页面。但是,因为登录页面传递了“ReturnUrl”参数,一旦他们登录,他们将被重定向回最初要进行POST的页面,但这次是使用GET。这会导致您描述的错误,因为显然不再存在任何POST数据。就像我说的,这只是一个猜测...


一些操作有[HttpPost]限制,但并非所有操作都有。此外,错误日志表明它确实是HTTP POST而不是GET。但这仍然是一个好建议。 - Joseph Daigle
啊,很遗憾,不确定还有什么其他建议,但希望你能解决它 :) - JonoW

0

你发布的错误信息似乎与表单没有任何问题。在我看来,这似乎是一个路由问题,所以我会问以下几个问题:

  • POST 请求是否发送到了正确的控制器/操作?例如,检查它是否发送到了正确的区域(如果您正在使用它)
  • 控制器操作的方法签名,特别是 myVariable 参数是否与路由模式匹配?换句话说,您的操作可能需要 myVariable,但调用它的 Url 可能没有 'myVariable' 或拼写错误等。

它正在触发正确的操作,因为我们在异常中收到了这个。问题是请求中的表单集合似乎为空。我们之所以看到这一点,是因为ASP.NET MVC找不到参数,而我们的错误日志报告表单集合为空。然而,我们最近发现HTTP请求中的CONTENT_LENGTH头是非零的,这表明我们应该收到/一些/内容。 - Joseph Daigle
此外,它的工作时间达到了99.5%。而且你可以重试相同的用户操作并且它会起作用。只是不到1%的时间似乎会失败。 - Joseph Daigle

0

1
你能提供一些关于jQuery的问题细节,或者至少是版本号吗? - polm23

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接