【问题标题】:HTML Form Data Lost On POSTPOST 时 HTML 表单数据丢失
【发布时间】:2011-08-29 19:45:27
【问题描述】:

我们有一个非常奇怪的问题,我们还不能诊断。我们的应用程序有许多特定的 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?

【问题讨论】:

  • 这听起来像是一个机器人正在访问您的网站。
  • 不是机器人,他们是经过身份验证的用户(我们可以通过 cookie 判断)。当它为他们出错时,用户会抱怨,我们会追溯到这些错误。

标签: asp.net html internet-explorer http-post forms


【解决方案1】:

问题的根源可以这样解释:Why does Internet Explorer not send HTTP post body on Ajax call after failure?

更新:事实证明,我们的具体症状似乎与 jQuery 的使用有关。升级后问题终于消失了。

【讨论】:

  • 您能否详细说明 jQuery 的问题是什么,或者至少是版本号?
【解决方案2】:

您发布的错误消息似乎与表单没有任何问题。对我来说,这看起来像是一个路由问题,所以我要问的是:

  • POST 是否转到正确的控制器/操作?例如,检查以确保它进入正确的区域(如果您正在使用它)
  • 控制器操作的方法签名,尤其是 myVariable 参数是否与路由模式匹配?换句话说,您的操作可能需要 myVariable 但调用它的 Url 没有“myVariable”或拼写错误等。

【讨论】:

  • 它正在触发正确的操作,因为这是我们收到异常的原因。问题是请求上的表单集合似乎是空的。我们看到这一点 a) 因为 ASP.NET MVC 找不到参数并且 b) 我们的错误日志报告表单集合为空。但是我们最近发现 HTTP 请求中的 CONTENT_LENGTH 标头不为零,这表明我们正在接收 /some/ 内容。
  • 此外,它在 99.5% 的时间内都有效。您可以重试相同的用户操作并且它可以工作。只是
【解决方案3】:

这可能有点猜测,但您的操作是否可能没有 [HttpPost] 限制,因此用户以某种方式通过 GET 而不是 POST 访问它?

我的应用中也发生过类似的情况,用户尝试 POST 到 URL,但他们的 FormsAuthentication 票证已过期,因此他们被重定向到登录页面。但是因为登录页面有传递给它的“ReturnUrl”参数,一旦他们登录,他们就会被重定向回他们原本要发布的页面,但这次使用的是 GET。这将导致您描述的错误,因为显然不再存在任何 POST 数据。正如我所说,有点猜测......

【讨论】:

  • 一些,但不是所有的动作都有 [HttpPost] 限制。此外,错误日志表明它确实是 HTTP POST,而不是 GET。但无论如何,这是个好建议。
  • 啊可惜,不知道还有什么建议,但希望你能弄清楚:)
猜你喜欢
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
  • 2014-08-31
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
相关资源
最近更新 更多