2015-12-22 121 views
0

我有一个查询要发送到AD并获取所有电子邮件。我的问题是,查询是否需要相当长的时间才能执行(通过AJAX 15-20秒)以拉动大约3000个电子邮件地址。我正在考虑将结果集(位于列表中)存储在memory cache中。我将这个列表放入一个下拉列表中,用电子邮件填充它。这里是我的查询:将查询结果存储在缓存中

public class EmailDetails 
    { 
     public string EmailAddress { get; set; } 
     public string EmailDisplayName { get; set; } 
    } 

    public List<EmailDetails> EmailInformation { get; set; } 

    [WebMethod] 
    public static List<EmailDetails> GetEmails() 
    { 
     List<EmailDetails> emailAddresses = new List<EmailDetails>(); 

     //queries AD to pull all users 
     var search = new DirectorySearcher(); 
     search.Filter = "(&(objectClass=user)(mail=*)(displayName=*))"; 
     search.PageSize = 1000; 

     using (var results = search.FindAll()) 
     { 
      foreach (SearchResult result in results) 
      { 
       emailAddresses.Add(new EmailDetails 
       { 
        EmailAddress = result.Properties["mail"][0].ToString(), 
        EmailDisplayName = result.Properties["displayName"][0].ToString() 
       }); 
      } 
     } 

     //sort email address list alphabetically and return sorted list 
     List<EmailDetails> sortedEmailAddresses = emailAddresses.OrderBy(o => o.EmailDisplayName).ToList(); 
     return sortedEmailAddresses; 

所以我的困境是,我试图找到一种方法来加快下拉的过程中被加载了返回的列表。什么是实现这一目标的最佳方式?内存缓存?我愿意接受任何您认为合理的选择...

回答

1

https://msdn.microsoft.com/en-us/library/94xkskdf.aspx将其存储在应用程序中。每次您回收应用程序池时都会清理它,并保持其余时间。没有什么奇特的,这个工作。

[WebMethod] 
public static List<EmailDetails> GetEmails() 
{ 
    if(HttpContext.Current.Application["sortedEmailAddresses"]==null) { 

     List<EmailDetails> emailAddresses = new List<EmailDetails>(); 

     //queries AD to pull all users 
     var search = new DirectorySearcher(); 
     search.Filter = "(&(objectClass=user)(mail=*)(displayName=*))"; 
     search.PageSize = 1000; 

     using (var results = search.FindAll()) 
     { 
      foreach (SearchResult result in results) 
      { 
       emailAddresses.Add(new EmailDetails 
       { 
        EmailAddress = result.Properties["mail"][0].ToString(), 
        EmailDisplayName = result.Properties["displayName"][0].ToString() 
       }); 
      } 
     } 

     //sort email address list alphabetically and return sorted list 
     List<EmailDetails> sortedEmailAddresses = emailAddresses.OrderBy(o => o.EmailDisplayName).ToList(); 
     HttpContext.Current.Application["sortedEmailAddresses"] = sortedEmailAddresses; 
    } 
    return HttpContext.Current.Application["sortedEmailAddresses"] as List<EmailDetails>; 
} 
+0

我该如何实现它? (即,我将在何处放置声明的语法?) – Code

+0

尝试此更新的解决方案 – AlexanderMP

+0

非常感谢你的队友。这就像一个魅力! – Code