无效的回发或回调参数

时间:2008-09-19 16:40:43

标签: asp.net exception

我有一个ASP.net应用程序在开发环境中工作正常,但在生产环境中,当单击执行回发的链接时会抛出以下异常。有什么想法吗?

  

无效的回发或回调参数。   使用启用事件验证      在配置或<%@ Page   EnableEventValidation =“true”%>在一个   页。为安全起见,这个   功能验证参数   回发或回调事件源自   从服务器控制那个   最初渲染它们。如果数据   是有效的和预期的,使用   ClientScriptManager.RegisterForEventValidation   注册方法   回发或回调数据   验证

编辑:这似乎只有在使用IE6查看时才会发生,而不是IE7,任何想法?

5 个答案:

答案 0 :(得分:2)

问题描述:  这是许多ASP.NET初学者面临,发布和询问的常见问题。通常情况下,他们会发布如下错误消息并寻求解决方案,而不会分享他们试图做的事情。

[ArgumentException:无效的回发或回调参数。使用配置或<%@ Page EnableEventValidation =“true”%>启用事件验证在一个页面中。出于安全考虑,此功能可验证回发或回调事件的参数是否来自最初呈现它们的服务器控件。如果数据有效且符合预期,请使用ClientScriptManager.RegisterForEventValidation方法注册回发或回调数据以进行验证。]

尽管错误堆栈跟踪本身通过设置事件验证来建议快速解决,但它不是推荐的解决方案,因为它会打开安全漏洞。了解它为什么会发生以及如何解决/处理根问题总是很好。

评估:  进行事件验证以验证事件的来源是否是相关的渲染控件(而不是某些跨站点脚本等)。由于控件在渲染期间注册其事件,因此可以在回发或回调期间(通过__doPostBack的参数)验证事件。这样可以降低未经授权或恶意回发请求和回调的风险。

参考:MSDN:Page.EnableEventValidation属性

基于以上所述,我在讨论中提出的可能出现的问题是:  案例#1:如果我们在请求数据中有尖括号,则看起来某些脚本标记正在传递给服务器。

可能的解决方案:  HTML在提交表单之前使用JavaScript编码尖括号,即将“<”替换为“<”,将“>”替换为“>”

function HTMLEncodeAngularBrackets(someString)
{
var modifiedString = someString.replace("<","&lt;");
modifiedString = modifiedString.replace(">","&gt;");
return modifiedString;
}

案例#2:如果我们编写客户端脚本在运行时更改客户端中的控件,我们可能会有一个悬空事件。一个示例可能是嵌入式控件,其中内部控件注册用于回发但由于在外部控件上执行操作而在运行时隐藏。我在Carlo编写的MSDN博客上阅读了这篇文章,因为有多个表单标签,因此会查找相同的问题。

可能的解决方案:  在页面的Render方法中手动注册事件验证控件。

protected override void Render(HtmlTextWriter writer)
{
ClientScript.RegisterForEventValidation(myButton.UniqueID.ToString());
base.Render(writer);
}

如上所述,报告的其他常见情况之一(看起来像是属于同一类别)是构建一个页面,其中一个表单标记嵌入在服务器上运行的另一个表单标记中。删除其中一个可以纠正流程并解决问题。

案例#3:如果我们在每次回发时在运行时重新定义/实例化控件或命令,则相应/相关事件可能会进行折腾。一个简单的例子可能是在每个页面加载(包括回发)上重新绑定数据网格。因为,在重新绑定时,网格中的所有控件都将具有新ID,在由数据网格控件触发的事件期间,在回发时控件ID会发生更改,因此事件可能无法连接到正确的控件来引发问题。

可能的解决方案:  这可以通过确保不在每次回发时重新创建控件(此处重新绑定)来简单地解决。使用Page属性IsPostback可以轻松处理它。如果你想在每个回发上创建一个控件,那么就必须确保ID没有被更改。

protected void Page_Load(object sender, EventArgs e)
{
if(!Page.IsPostback)
{
// Create controls
// Bind Grid
}
}

结论:  如上所述,一个简单/直接的解决方案可以在Page指令或Web.config文件中添加enableEventValidation =“false”,但不建议这样做。根据实施和原因,找出根本原因并相应地应用解决方案。

答案 1 :(得分:1)

如果您发布的内容似乎可能是恶意内容,则会发生这种情况;例如,其中包含html但在回发之前未编码的文本框。如果您允许提交html或脚本,则需要对其进行编码,以便将字符(例如&lt;)作为&amp; LT;

答案 2 :(得分:0)

当发生回发时,似乎更改了页面上的数据/控件。如果在页面指令中关闭事件验证会发生什么。

<%@ Page ... EnableEventValidation = "false" />

答案 3 :(得分:0)

当我在页面中嵌套<form>标签时,我才会得到这个。 IE6将查看嵌套的表单标记,并尝试在那些表单以及主ASP.NET表单中发布值,从而导致错误。其他浏览器不发布嵌套表单(因为它是无效的HTML),并且不会收到错误。

您当然可以通过执行EnableEventValidation = "false"来解决此问题,但这可能意味着您发布的值和视图状态存在问题。最好首先清除嵌套的<form>标记。

还有其他地方可以出现这种情况,例如表单字段中的HTML-esque值,但我认为这些错误消息更具体。在抛出此内容的通用回发中,我只需检查呈现的页面以获取额外的<form>标记。

答案 4 :(得分:0)

我有一些类似的事情发生在我手动输入文本时,ListBox工作正常但是当我根据SQL查询输入数据时,列表中的最后一项会引发此异常。我搜索了所有Q&amp; A,没有任何东西符合我的问题。

就我而言,问题是SQL数据中存在一个不可打印的字符(\ r \ n)。我猜测服务器根据不可打印的字符的存在创建了一个哈希码,但它从实际出现在ListBox中的字符串中删除,因此第二个哈希与第一个哈希不匹配。在将字符串放入ListBox之前清理字符串并删除不可打印的字符修复了我的问题。

这可能是一个超级优势案例,但我想补充一点就是完成(并希望帮助其他人不要花2天时间疯狂)。