0

我想加快我一直在从事的 asp.net 项目的加载时间。其中之一dropdownlists是通过将 sql 表中的员工列表与 Active Directory 成员资格进行比较而获得的经理列表。

这被称为Page_Load

        SqlDataSource empDB = (SqlDataSource)Page.Master.FindControl("EmployeeData");
        DataView dv = (DataView)empDB.Select(DataSourceSelectArguments.Empty);

        foreach (DataRowView drv in dv)
        {
            employeeList.Add(new Employee(int.Parse(drv["EMP_ID"].ToString()), drv     ["FULL_NAME"].ToString()));
        }

        managerTest();

        managerDropDownList.DataSource = managerList;
        managerDropDownList.DataTextField = "fullName";
        managerDropDownList.DataValueField = "emp_Id";
        managerDropDownList.DataBind();

经理测试方法:

     private void managerTest()
    {

        PrincipalContext domainContext = new PrincipalContext(ContextType.Domain, "the_domain");
        GroupPrincipal managersGroup = GroupPrincipal.FindByIdentity(domainContext, "Managers and Supervisors");
        GroupPrincipal offManagersGroup = GroupPrincipal.FindByIdentity(domainContext, "Office Managers");
        GroupPrincipal executivesGroup = GroupPrincipal.FindByIdentity(domainContext, "Executives");
        GroupPrincipal managers2Group = GroupPrincipal.FindByIdentity(domainContext, "Managers");

        foreach (Employee emp in employeeList)
        {
            UserPrincipal user = UserPrincipal.FindByIdentity(domainContext, emp.fullName);

            if (user != null)
            {
                if (user.IsMemberOf(managersGroup) || user.IsMemberOf(offManagersGroup) || user.IsMemberOf(executivesGroup) || user.IsMemberOf(managers2Group))
                {
                    managerList.Add(emp);
                }
            }
        }

    }

Employee 只是一个简单的类,用于分隔名字、姓氏和全名的值。

问题是页面加载速度非常慢,并且页面上有几个控件可以回发并导致回发需要很长时间。我能做些什么来提高这项工作的效率吗?

4

2 回答 2

2

几件事。第一的。您应该将您在 page_load 中发布的所有代码包装在if (!IsPostBack). 您只需要绑定一次,而不是每次加载页面。除非您当然关闭了视图状态。

第二。经理多久更换一次?可能不会那么频繁。我建议将其存储在 asp.net 中Cache。哎呀,您可能想在Global.asaxApplication_Start 中缓存它。否则,第一个访问该页面的人将受到性能影响。但这肯定比每次有人访问该页面时都加载它要好得多。然后,您可以根据需要关闭页面上的视图状态。

下一个。我认为您使用 AD 的方式非常低效。您正在循环中为每个员工调用它。你这样做的唯一原因是要查明他们是否是经理。与其那样做,不如先找出所有经理是谁。换句话说:调用 AD 以获取您关心的组的成员。请参阅此问题:get all users from a group in Active Directory,了解如何找到 AD 组的所有成员。我怀疑这真的有助于提高性能。

于 2012-07-10T20:43:09.880 回答
1

一个简单的改进是只加载DropDownList一次,然后依靠页面的视图状态来维护其状态,只需将以下检查添加到您的页面:if (!this.IsPostBack)

if (!this.IsPostBack)
{
       SqlDataSource empDB = (SqlDataSource)Page.Master.FindControl("EmployeeData");
        DataView dv = (DataView)empDB.Select(DataSourceSelectArguments.Empty);

        foreach (DataRowView drv in dv)
        {
            employeeList.Add(new Employee(int.Parse(drv["EMP_ID"].ToString()), drv     ["FULL_NAME"].ToString()));
        }

        managerTest();

        managerDropDownList.DataSource = managerList;
        managerDropDownList.DataTextField = "fullName";
        managerDropDownList.DataValueField = "emp_Id";
        managerDropDownList.DataBind();
}

问题是页面加载速度非常慢,并且页面上有几个控件回发并导致回发需要很长时间

我认为在这种情况下,如果您使用 AJAX,您的页面响应能力将会得到改善。

在没有控件的情况下实现 AJAXUpdatePanel将为您提供最佳的 UI 性能,但是您需要更改一些内容才能使其正常工作

您可以使用UpdatePanel控件执行部分更新感知性能会提高,因为您不会做完整的帖子,并且与实现纯 AJAX 调用相比,学习曲线非常小。

进行部分页面回发的基本步骤是:

  • ScriptManager向 ASPX 页面添加控件(每个使用UpdatePanel必须有ScriptManager控件的页面)

  • UpdatePanel在您的 ASPX 页面中创建一个,并将ContentTemplate您希望作为部分回发响应的一部分呈现的所有控件放入其中

  • 像在正常的完整回发中一样创建服务器事件

您可以检查以下问题以获得更详细的UpdatePanel控件使用

如何在同一个 .aspx 页面上使用两个更新面板

作为参考,请查看以下文章:

于 2012-07-10T20:37:03.177 回答