AjaxControlToolkit NoBotState始终是InvalidBadResponse

我正在尝试实现AjaxControlToolkit NoBot,但我总是从IsValid()方法得到错误(状态值总是InvalidBadResponse )。 我在这里错过了什么吗?

ASCX代码:

 // buttons, textboxes etc.  

代码背后:

 protected void Button1_Click(object sender, EventArgs e) { AjaxControlToolkit.NoBotState state; if (!NoBot1.IsValid(out state)) { Page page = HttpContext.Current.Handler as Page; ScriptManager.RegisterStartupScript(page, page.GetType(), "err_msg", "alert('" + " BOT " + "');", true); } else { ...} } 

更奇怪的是:我输入数据进行登录并点击asp按钮。 NoBot状态是InvalidBadResponse ,它失败了。 但是,然后我点击浏览器的刷新按钮它要求我重新发送请求我说好,现在状态是有效的! 为什么?

我知道你从NoBot控件获得“ InvalidBadResponse ”的唯一原因是你的浏览器中禁用了javascript。 文档页面指出NoBot使用的技术NoBot

强制客户端的浏览器执行可配置的JavaScript计算并validation结果作为回发的一部分。 (例如:计算可能是一个简单的数字计算,或者也可能涉及DOM以确保涉及浏览器)

InvalidBadRespone ”消息表示javascript未执行(也来自上面的链接):

InvalidBadResponse:向质询提供了无效响应,表明未运行质询脚本

我会仔细检查您的浏览器设置。 我已经通过在浏览器中禁用javascript(只是为了确保)并在文档页面上尝试示例来测试这一点。

您可以使用OnGenerateChallengeAndResponse属性自定义计算以指定事件处理程序。 我实现一个这样的事件处理程序的好例子就是这个( 这个post的代码信用):

 protected void PageNoBot_GenerateChallengeAndResponse(object sender, AjaxControlToolkit.NoBotEventArgs e) { Random r = new Random(); int iFirst = r.Next(100); int iSecond = r.Next(100); e.ChallengeScript = String.Format("eval('{0}+{1}')", iFirst, iSecond); e.RequiredResponse = Convert.ToString(iFirst + iSecond); } 

正如其他答案中所提到的, InvalidBadResponse是由于Javascript挑战失败造成的。

问题:

它失败的原因是因为运行它的ASP.NET ajax库无法加载; 看看你的浏览器的javascript调试器; 这就是我的(在Chrome中)的样子

在此处输入图像描述

正如您所看到的, .axd文件未被提供,并且ASP.NET Ajax client-side framework failed to load错误ASP.NET Ajax client-side framework failed to load错误的错误非常明显。

原因:(在我的情况下)

我有一个url重写规则,意外地改变了.axdurl – 导致它们无法提供服务。

我建议检查你的web.config ,如果需要添加该行

  

你的规则和这个

 routes.Ignore("{resource}.axd/{*pathInfo}"); 

在您的Global.asax (如果有的话)中,您注册路线(以及如果)。

检查这个SO答案: Ajax客户端框架无法加载Asp.Net 4.0

另一个可能的原因可能是master,page或control的ViewStateMode被设置为Disabled。 似乎需要启用它以使NoBot正常工作。

我在CMS的主页面上使用ViewStateMode =“Disabled”进行了一些测试,NoBotState开始在我的登录页面上返回InvalidBadResponses。 将其更改为ViewStateMode =“已启用”为我修复了它。