0

私が取り組んでいる asp.net プロジェクトの読み込み時間を短縮したいと考えています。そのうちの 1 つは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)。ページが読み込まれるたびにバインドする必要はなく、1 回だけバインドする必要があります。もちろん、ビューステートをオフにしていない限り。

2番。マネージャーはどのくらいの頻度で変わりますか? おそらくそれほど頻繁ではありません。これを asp.net に保存することをお勧めしCacheます。Global.asaxApplication_Startにキャッシュしたいかもしれません。そうしないと、最初にページにアクセスしたユーザーのパフォーマンスが低下します。しかし、誰かがページにアクセスするたびにロードするよりもはるかに優れています。必要に応じて、ページのビューステートをオフにすることができます。

次。あなたのADの使い方は非常に非効率的だと思います。ループ内のすべての従業員に対して呼び出しています。そして、あなたがそれをしている唯一の理由は、彼らがマネージャーであるかどうかを調べることです. そのようにする代わりに、最初にすべてのマネージャーが誰であるかを調べます。つまり、AD を呼び出して、関心のあるグループのメンバーを取得します。この質問を参照してください: AD グループのすべてのメンバーを見つける方法については、Active Directory のグループからすべてのユーザーを取得してください。それは本当にパフォーマンスに役立つと思います。

于 2012-07-10T20:43:09.880 に答える
1

簡単な改善の 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 を使用するとページの応答性が向上すると思います。

コントロールなしで AJAX を実装UpdatePanelすると、最高の UI パフォーマンスが得られますが、適切に機能させるには、いくつかの変更が必要になります。

UpdatePanelコントロールを使用して部分的な更新を実行できます。完全な投稿を行わないため、知覚されるパフォーマンスが向上します。また、純粋な AJAX 呼び出しを実装する場合と比較して、学習曲線は非常に小さくなります。

部分ページ ポストバックを行う基本的な手順は次のとおりです。

  • ScriptManagerコントロールを ASPX ページに追加します ( UpdatePanelMUST を使用するすべてのページにはScriptManagerコントロールが必要です) 。

  • UpdatePanelASPX ページに を作成し、部分的なポストバック応答の一部としてレンダリングするContentTemplateすべてのコントロールを配置します。

  • 通常のフル ポストバックで行うように、サーバー イベントを作成します。

UpdatePanelコントロールのより詳細な使用法については、次の質問を確認してください。

同じ .aspx ページで 2 つの更新パネルを操作する方法

参考までに、以下の記事をご覧ください。

于 2012-07-10T20:37:03.177 に答える