c# - 无效的回发或回调参数。启用事件验证... - 仅在 IIS 10 Selenium 测试下
问题描述
我正在努力解决一个仅在特定情况下发生的非常奇怪的问题。
我们正在将我们的 web 托管环境从 win 2012 IIS 8 升级到 win 2019 IIS 10。我们在 .NET Framework 4.7.2 中构建了 web 应用程序,并在 CLR 4.0 版集成下运行。
我有很多使用 Selenium 运行的自动化测试(Selenium.WebDriver nuget 包 3.141)。我们的其中一个页面能够根据它所显示的表单交换它使用的母版页。该测试在我们现有的环境中运行良好。其他形式仍然可以正常工作。
但是,在新的 IIS 10 环境中,只有一个特定的母版页,并且仅适用于这个特定的表单页,如果:
- Selenium 发布页面(通过提交按钮)
- 它返回验证错误
- Selenium 然后通过同一个按钮使用有效或无效数据再次发布它
- 该页面因以下错误而爆炸:
错误级别 1
HttpUnhandledException -> 引发了“System.Web.HttpUnhandledException”类型的异常。StackTrace:在 System.Web.UI.Page.HandleError(异常 e)在 System.Web.UI.Page.ProcessRequestMain(布尔 includeStagesBeforeAsyncPoint,布尔 includeStagesAfterAsyncPoint)
在 System.Web.UI.Page.ProcessRequest(布尔 includeStagesBeforeAsyncPoint,布尔 includeStagesAfterAsyncPoint)
在 System.Web.UI.Page.ProcessRequest() 在 System.Web.UI.Page.ProcessRequest(HttpContext context) 在 c:\Windows\Microsoft.NET\Framework64\v4 中的 ASP.plt_pltgeneral_aspx.ProcessRequest(HttpContext context)。 0.30319\Temporary ASP.NET Files\root\82a5c1fe\a330c9cd\App_Web_w4e2wdui.14.cs:System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 处 System.Web.HttpApplication.ExecuteStepImpl 处的第 0 行(IExecutionStep 步骤)
在 System.Web.HttpApplication.ExecuteStep(IExecutionStep 步骤,Boolean& completedSynchronously)错误级别 2
ArgumentException -> 无效的回发或回调参数。使用配置或页面中的 <%@ Page EnableEventValidation="true" %> 启用事件验证。出于安全目的,此功能验证回发或回调事件的参数是否源自最初呈现它们的服务器控件。如果数据有效且符合预期,请使用 ClientScriptManager.RegisterForEventValidation 方法注册回发或回调数据以进行验证。堆栈跟踪:
在 System.Web.UI.ClientScriptManager.ValidateEvent(String uniqueId, String argument) 在 System.Web.UI.Control.ValidateEvent(String uniqueID, String eventArgument) 在 System.Web.UI.WebControls.DropDownList.LoadPostData(String postDataKey, NameValueCollection postCollection) 在 System.Web.UI.Page.ProcessPostData(NameValueCollection postData, Boolean fBeforeLoad) 在 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
如果通过手动测试以相同的顺序提交相同的表单,它就可以正常工作。但是,如果您通过 selenium 启动浏览器,然后暂停测试并手动完成序列,它仍然会爆炸。因此,Selenium、IIS 10、第二次回发的页面以及此特定母版页的组合存在一些问题。
我目前的理论,因为这一切都在现有环境中有效,所以在 IIS 10 中必须随着事件验证的发生方式发生变化。它是在两种环境中运行的相同代码。
我正在寻找有关 IIS 升级为什么会触发这个非常具体的问题的理论/修复,以及可能触发它的原因,以便我可以解决它。
编辑:
我已将问题追溯到一个旧的隐藏下拉列表:
<div style="float: right; position: relative; visibility: hidden;" class="nav2">
<asp:DropDownList ID="ddlCountry" runat="server" AutoPostBack="true" Visible="false" EnableViewState="false" OnSelectedIndexChanged="ddlCountry_OnSelectedIndexChanged" />
</div>
呈现为以下 HTML:
<div style="float: right; position: relative; visibility: hidden;" class="nav2">
<select name="ctl00$ddlCountry" onchange="javascript:setTimeout('__doPostBack(\'ctl00$ddlCountry\',\'\')', 0)" id="ctl00_ddlCountry">
<option value="All">All</option>
<option selected="selected" value="1">United States</option>
如果我修改包装 div 使其不呈现:
<div style="float: right; position: relative; visibility: hidden;" class="nav2" runat="server" Visible="false">
然后问题就消失了。
在这种情况下,这对我来说将是一个很好的解决方案,因为无论如何这都会清除旧代码。但是,它仍然感觉 IIS 中发生了一些变化(可能已经修复),导致它的行为有所不同。
解决方案
问题最终成为.net 正在呈现的隐藏 DropDownList 控件,即使它被设置为不可见。一旦我删除了旧代码,问题就解决了。
我最好的猜测是这里有两个错误在起作用。呈现一个本应不可见的控件的 .net 错误。还有一个新的 IIS 10/CLR 错误,它不会忽略对不可见控件的更改。
这两个潜在的错误加上可能被 selenium 修改的不可见控件可能已经合并在一起为我创建了这个场景。
推荐阅读
- python - 如何使用 PyWinAuto 在对话框中单击按钮
- stm32 - stm32 freeRTOS软件定时器中的回调参数
- php - 复杂 OrderBy 使用多列
- kubernetes - GCP Kubernetes 集群上的 FailedCreatePodSandBox
- sharepoint - 找不到类型或命名空间名称“ContentBySearchWebPart”
- authentication - .Net core web api - 基于角色的授权(允许特定域而不询问 JWT)
- python - 了解 pip 安装日志
- angular - 如何暂停效果的 concatMap 处理,但不取消完整队列?
- css - 为 ֍ 字符完美无限旋转
- excel - 根据 if 条件和每个循环对范围内的值求和