【问题标题】:AjaxControlToolkit NoBotState is always InvalidBadResponseAjaxControlToolkit NoBotState 始终为 InvalidBadResponse
【发布时间】:2011-10-27 11:29:48
【问题描述】:

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

ASCX 代码:

// buttons, textboxes etc.
<asp:NoBot ID="NoBot1" 
           runat="server"             
           CutoffMaximumInstances="5" 
           CutoffWindowSeconds="60" 
           ResponseMinimumDelaySeconds="2"
           />

后面的代码:

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,但它失败了。但是,然后我点击浏览器的刷新按钮,它要求我重新发送请求,我说好的,现在状态有效!为什么?

【问题讨论】:

  • 您能出示您的验证码吗?是否启用了 ViewState 和 SessionState?
  • 是的,一切都已启用。身份验证代码是标准的成员资格方法(验证用户,如果不是登录失败)它可以工作。该代码在我的上层代码中的“ELSE”块中。但是第一次 NotBot1.IsValid 状态总是 InvalidBadResponse。但是当我按下刷新它是有效的。更糟糕的是,我已经从教程页面下载了示例代码,并且再次出现了同样的问题。我在本地主机上测试这个。
  • 您是否在页面上使用更新面板?如果你这样做,你能显示标记吗?
  • 不,我不使用任何更新面板。这是自定义 dotNetNuke 模块。 Dnn 使用 asp scriptManager。我无法改变它。 NoBot 是否需要 ToolkitScriptManager?
  • 看起来 SessionState 中的 controlstate 值与页面上隐藏字段中存储的值不匹配。尝试使用 UpdateMode="Alwyas" 将 NoBot 控件放入 UpdatePanel

标签: c# asp.net ajaxcontroltoolkit


【解决方案1】:

我知道您会从NoBot 控件获得“InvalidBadResponse”的唯一原因是您的浏览器中禁用了 javascript。 documentation page 声明 NoBot 使用的技术之一是

强制客户端的浏览器执行可配置的 JavaScript 计算和验证结果作为回发的一部分。 (例如: 计算可能是简单的数字,也可能涉及 DOM 为了进一步确保涉及浏览器)

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

InvalidBadResponse:对质询提供了无效响应 提示挑战脚本未运行

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

您可以使用OnGenerateChallengeAndResponse 属性自定义计算以指定事件处理程序。我实现这样一个事件处理程序的一个很好的例子是这个(代码归功于this 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);  
}

【讨论】:

    【解决方案2】:
    【解决方案3】:

    如其他答案所述,InvalidBadResponse 是由于 Javascript 质询失败所致。

    问题:

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

    如您所见,.axd 文件没有被提供,错误 ASP.NET Ajax client-side framework failed to load 错误很能说明问题。

    原因:(以我为例)

    我有一个 url 重写规则,它意外更改了 .axd url - 导致它们无法被提供。

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

    <add input="{URL}" pattern="\.axd$" negate="true"/>
    

    遵守你的规则和这个

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

    在你的Global.asax(如果你有的话)你在哪里(如果)注册路线。

    查看这个 SO 答案:Ajax client-side framework failed to load Asp.Net 4.0

    【讨论】:

      【解决方案4】:

      另一个可能的原因可能是母版、页面或控件的 ViewStateMode 设置为已禁用。似乎需要启用它才能让 NoBot 正常工作。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-10
        • 1970-01-01
        • 2019-12-19
        • 1970-01-01
        • 2017-07-31
        • 2019-07-18
        • 2019-08-18
        • 2011-12-29
        相关资源
        最近更新 更多