检测在调试中工作的刷新/后备条件,但不能生产



搜索网络后,似乎有一个强烈共识,即防止刷新启用数据库访问的好方法是使用ViewState变量和会话变量来检测条件。这是我的基本页面中的代码:

    protected override void OnLoad( EventArgs e )
    {
        base.OnLoad( e ); 
        if ( IsPostBack && ViewState["REFRESH_CHECK"] != Session["REFRESH_CHECK"] )
        {
            IsRefresh = true;
        }
        Session["REFRESH_CHECK"] = System.Guid.NewGuid().ToString();
        ViewState["REFRESH_CHECK"] = Session["REFRESH_CHECK"];
    }
    public virtual bool IsRefresh
    {
        get;
        private set;
    }

所以在我的页面中,我有一些看起来像这样的代码:

    protected void Page_Load( object sender, EventArgs e )
    {
        if ( !IsPostBack )
        {
            if ( !IsRefresh )
            {
                doStuffThatShouldOnlyBeDoneOnce();
            }
        }
    }

这在调试时可以很好地工作,但是当我在生产系统上运行时,我总是会得到两个dostuff的调用...()方法。当然,当我调试它时,只有一个电话。

它可能相关,也可能不相关,但我也使用嵌套主页。

有什么想法?

哦,男人,请不要使用此代码,这可能会破坏您的网页。对于简单的测试,请尝试使用两个不同的选项卡打开同一页面,您会发现该解决方案已失败。F5刷新问题的唯一解决方案是Response.Redirect。我已经尝试了这种解决方案,所以我从我的经验中告诉你。

半答案

我无法弄清楚为什么page_load()在生产环境中被调用两次,在调试模式下一次被调用。

关于刷新DB两次刷新的技术都不为我工作。

所以我采用的方法是改变完成工作的地方。我没有在加载新页面时执行代码,而是在重定向之前按下按钮控件的代表中的代码。

delegate( Object o, EventArgs eventArgs ) 
{
    doStuffHere();
    HttpContext.Current.Response.Redirect( "admin/Admin.aspx", false );
}

在这种情况下,下一页需要基于上一页完成一些设置,只要我先于所有重定向之前,一切都可以。如果用户直接进入URL,这不起作用,但是对于这种特殊情况,这还可以 - 该页面不会完全填充,但不会导致错误,并且用户仍然可以工作。

最新更新