1

我们有一个在 IIS7 上运行的 asp.net 2.0 Web 应用程序。它使用网络花园和 asp.net 状态服务器。

在页面上,有许多用户控件。在其中一个用户控件上,我们添加了对 button_click 事件的日志记录,该事件在该方法运行时会在日志中写入一行。当我们单击按钮时,它只会定期显示日志条目——表明单击按钮时事件并不总是触发。我们添加了日志记录,因为我们怀疑单击按钮时按钮单击方法并不总是在运行。我们看到的证据似乎证实了我们的怀疑。

当我们移除网络花园并将站点放回单个应用程序池时,应用程序恢复正常 - 每次都会触发按钮事件。当我们在本地开发者机器上运行应用程序时,它也能正常工作。

有没有其他人看到过这样的行为?对于我们可以采取哪些措施来缩小问题范围,有什么建议吗?

编辑:这是所要求的事件来源:

protected void btnSearch_Click(object sender, EventArgs e)
    {
        Log.Error("Searching...");

        SearchArgs args = CtrlToSearchArgs();
        SessionManager.SearchQueryString = Request.QueryString;

        string url = NavigationManager.BuildSearchUrl(args, null, "*** page url removed here ***");

        if (args.PageSize.HasValue)
        {
            SessionManager.SetInSession(SessionManager.Key.SEARCH_PAGESIZE, args.PageSize.Value.ToString());
        }
        else
        {
            SessionManager.SetInSession(SessionManager.Key.SEARCH_PAGESIZE, "10");
        }

        SessionManager.SearchPanelData = url;

        //Set the new args into the session
        SessionManager.SearchControlArgs = args;

        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Redirect(url);
    }

编辑#2:澄清-此设置未使用多个服务器,并且不在负载平衡器下。我们在单个服务器上使用多个 AppPool。

4

3 回答 3

1

设置您的机器密钥:http: //msdn.microsoft.com/en-us/library/ms998288.aspx

当您没有指定机器密钥时,这不是唯一失败的情况,即如果重新启动应用程序池,生成的机器密钥更改并且您在任何依赖它的情况下都会失败,即视图状态验证是一个,另一个:ViewState MAC 的 ASP.NET MVC 验证失败

于 2009-10-19T16:35:22.947 回答
0

您可能希望在负载均衡器上启用粘性会话。

过去我遇到过类似的情况,页面由服务器 A 呈现,但回发被发送到服务器 B 导致无法验证回发。

或者,您可能还想考虑手动将 MachineKey 设置为对所有服务器都相同,而不是使用粘性会话。

于 2009-10-19T16:21:45.223 回答
0

感谢 Freddy 和 Jason 发布答案。

在我们的故障排除过程中,我们决定恢复到单个应用程序池。无论如何,这似乎是一种非常非正统的结构方式。但是,这也没有解决问题。

在转了一圈又让几个人检查代码之后,我们终于发现我们有一个存储在 session 中的对象,其中包含静态变量。我们解决了这个问题,网站开始按预期工作。

于 2009-10-27T15:31:18.303 回答