ASP.NET Ajax错误:Sys.WebForms.PageRequestManagerParserErrorException

时间:2008-11-14 13:45:46

标签: javascript asp.net .net exception-handling ajax.net

在尝试执行任何 Ajax活动时,我的网站一直给我间歇性错误。我收到的消息是

Sys.WebForms.PageRequestManagerParserErrorException: The message received from the server could not be parsed. Common causes for this error are when the response is modified by calls to Response.Write(), response filters, HttpModules, or server trace is enabled.

Details: Error parsing near '

<!DOCTYPE html P'.

所以它显然是某种服务器超时或服务器只是返回错误的垃圾。不幸的是,这通常不会发生

15 个答案:

答案 0 :(得分:22)

Eilon Lipton有一篇很棒的博客文章。它包含许多关于如何避免此错误的提示:

<强> Sys.WebForms.PageRequestManagerParserErrorException - what it is and how to avoid it

阅读评论。有一个人有同样问题的评论:“我解决了它在IIS上改变我的应用程序池的服务器空闲时间。它只有5,所以我增加了它,现在有效。”

“UpdatePanel控件使用异步回发来控制页面的哪些部分被渲染。它使用客户端上的一大堆JavaScript和服务器上的一大堆C#来实现。 < / p>

异步回发与常规回发完全相同,除了一件重要的事情:渲染。异步回发与常规页面一样经历相同的生命周期事件(这是我经常被问到的问题)。

只有在渲染阶段,事情才会有所不同。我们仅捕获我们关心的UpdatePanel的呈现,并使用特殊格式将其发送到客户端。此外,我们还会发送一些其他信息,例如页面标题,隐藏的表单值,表单操作URL和脚本列表。“

该错误的最常见原因:

  1. 调用Response.Write():
  2. 响应过滤器
  3. 的HttpModules
  4. 启用服务器跟踪
  5. 调用Server.Transfer()

答案 1 :(得分:9)

回发后可能会发生错误。在这种情况下,您可以通过向updatepanel添加PostBackTrigger并引用导致问题的按钮来查看有关错误的详细信息:

    <asp:updatepanel ID="updatepanel1" runat="server">
        <Triggers>
            <asp:PostBackTrigger ControlID="button1" /> 
        </Triggers>
        <ContentTemplate>

        </ContentTemplate>
    </asp:updatepanel>

答案 2 :(得分:4)

我遇到了这种情况,并且答案中列表中没有任何原因。在我完全禁用我的AJAX之前,我没有找到问题的根源。发现代码将对象保存到包含不可序列化对象的ViewState。我使对象可序列化,它又开始工作了。

答案 3 :(得分:1)

我解决了同样的问题,从Content-Type: Custom HTTP Headers标签中的HTTP Headers部分移除了IIS。这打破了页面的编码,不知何故它影响了Ajax。

我在Content-Type中配置的IIS将编码设置为ISO-8859-1

答案 4 :(得分:1)

这可能有点hacky,但它解决了我的问题。我没有任何常见的错误原因,所以我只是在页面加载中加入了这个创可贴:

if (Session.SessionID == "")
{
    Page.Session.Add("SessionID", Session.SessionID);
}

答案 5 :(得分:1)

问题:重定向页面时会发生Sys.WebForms.PageRequestManagerParserErrorException,让我们说按钮在aspxAjax中的UpdatePanel内点击。

溶液:

  1. 在您使用更新面板的aspx页面中添加“GoTo”按钮,并将其添加到“更新”面板外

  2. 在您的代码中,只将已注册的userID分配给会话变量,例如来自DB或UsernameField的Session["UseridJustregistered"]=Id

  3. Respose.Redirect("regSucces.aspx?urlid='" + Session["UseridJustregistered"] + "'");

  4. 检查Session["UseridJustregistered"]是否为空

  5. 这是旧的经典ASP方式可以解决我们的问题,当微软找到我们可以解决这个问题的解决方案时。

答案 6 :(得分:1)

我通过删除错误嵌套的UpdatePanel解决了同样的问题。

答案 7 :(得分:1)

我终于解决了同样问题的变种。我试图在webform中的两个列表框之间复制/移动选定的值。在我的情况下,我必须在第二次执行操作之前专门调用{listbox} .ClearSelection()。

显然,出于多种原因,可能会出现此问题/错误消息。

答案 8 :(得分:1)

将应用程序池从INTEGRATED更改为asp.net classic解决了我的问题。

答案 9 :(得分:1)

在我们的案例中,问题是由路上的重写代理引起的。重写修改了更新面板响应的内容。但是这个回复还包含原始大小。重写机制不能知道响应的几个字节实际上包含原始响应大小,它也应该被修改。

更新面板响应如下所示:

1|#||4|30502|updatePanel|pnlUpdate| ...

30502是要更新的内容的原始大小。重写引擎修改输出,但大小保持不变=&gt;解析器错误异常。

我没有看到如何从客户端克服此问题的方法。我们需要知道内容是如何修改的,然后在UpdatePanel ClientScript开始处理之前以某种方式更改响应中的大小。

答案 10 :(得分:0)

我也遇到了这个错误。 “user1097991”报告的解决方案解决了一段时间(我在viewstate上使用了未序列化的对象)

但后来错误再次出现,现在是随机的。经过一番搜索,我得到了答案:视图状态变得太大而被截断了。我在网格和菜单上禁用了一些视图状态,但问题再没有显示出来。

答案 11 :(得分:0)

我发现我的问题与在GridView的数据绑定中呈现的空字符有关。预期的响应长度与响应文本的实际长度不匹配,导致错误被抛出。一旦我修复了数据库中的数据,我就不再收到错误了。最终的解决方法是清理在RowDataBound事件期间渲染的文本。

查看数据库,我看不到错误的数据,因为如果字符串中的空字符(Char(0)),SQL Server 2008不会显示文本。在我的GridView的RowDataBound事件中,我添加了代码,为任何包含特殊字符的文本抛出异常。这就是我找到包含空字符的记录的方式。

tl; dr - 检查渲染的html中的空字符。

答案 12 :(得分:0)

另请注意,这可能是因为没有正确的html编码可能会导致您通过部分回发向页面呈现的内容。

答案 13 :(得分:0)

我有完全相同的错误。

对我而言

<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>

缺少web.config(.Net 3.5 app)的httpModules部分

这个错误似乎可能与许多不同的事情有关。

答案 14 :(得分:0)

将ScriptMode更新为“发布”

<asp:ScriptManager ID="ScriptManager" runat="server" ScriptMode="Release"></asp:ScriptManager>