页面事件验证失败发生在一个环境中,而不是另一个环境中

时间:2014-03-05 18:17:47

标签: c# asp.net eventvalidation

我在使用我们的网络应用程序的特定步骤下获得了相当标准的事件验证错误:

Application_Error intercepted exception: Exception of type 'System.Web.HttpUnhandledException' was thrown.
System.Web.HttpUnhandledException: Exception of type 'System.Web.HttpUnhandledException' was thrown. ---> System.ArgumentException: Invalid postback or callback argument.  Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page.  For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them.  If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.

真正的headscratcher是在我们的测试环境中发生这种情况,但在我尝试重新创建时却不是我的开发环境。我已经仔细阅读了我们的web.config以了解可能已经发生变化的事情,但我没有看到任何跳出来的东西。环境之间的代码完全相同 - TeamCity确定了这一点。所以我强烈怀疑环境问题,但我不知道从哪里开始进行事件验证。这通常用代码处理。

有没有人有想法对此进行调查?我意识到我正在做的一些细节很稀疏,但那是因为在我们的开发环境中一切都很好,并且没有任何问题,所以我不知道什么是相关的,什么不会'吨。如果需要更多详细信息,请询问,我很乐意提供。

2 个答案:

答案 0 :(得分:1)

据推测,您已经检查了配置文件中的enableEventValidation属性 - 默认情况下,这不存在。但它很可能在一台或两台机器上的machine.config中,导致该选项的配置不同。

答案 1 :(得分:0)

对后人来说,就是这种情况。

我们有一些下拉列表,这些列表是通过HTTPWebSession缓存中的信息填充的。大。在我们的工作流程中,我们还有一个AJAX部分回发,因为我们必须对用户输入进行一些服务器端验证,而不会搞砸屏幕上的所有内容。仍然没问题。

当此部分回发返回时会发生此问题,并尝试使用链接到项目中不再存在的图像的某些CSS类。图像被移动了。这将返回404s。只要代码实际上没有使用这些图像,您仍然认为这不是问题。它不是。

问题在于,在我们的测试环境中,404是404.它只是返回,没什么大不了的。在我们的生产环境中,我们将404错误重定向到我们的登录页面,因为这是一个糟糕的用户体验,并且隐含地揭示什么存在和不存在是不好的。这是环境因素。

...因为我们在高安全性环境中工作,所以登录页面将缓存作为其PreRender的一部分进行擦除,因此无论是否实际加载页面图形都无关紧要。 Ergo,一个AJAX部分回发擦除了缓存,这使得会话加载的信息在下拉列表中 - 不会被部分回发更新! - 不是预期的输入。而且,完全合理的是,事件验证拒绝在整页提交中接受此输入。

通过删除CSS类,解决了这个奇怪而复杂的问题。