SORU
18 EYLÜL 2008, PERŞEMBE


Asp.Net bir DirectorySearcher 1000'den fazla kayıt alabilir miyim?

Sadece sonuçlar için iade listesinde 1000 sınırlı olduğunu fark ettim. Benim etki alanı (etki alanı BÜYÜK) 1000'den fazla grup var. Nasıl 1000'den fazla kayıt alabilir miyim? Daha sonra bir kaydı başlayabilir miyim? Onu çok arar içine kesebilir miyim?

İşte benim sorgu:

DirectoryEntry dirEnt = new DirectoryEntry("LDAP://dhuba1kwtn004");
string[] loadProps = new string[] { "cn", "samaccountname", "name", "distinguishedname" };
DirectorySearcher srch = new DirectorySearcher(dirEnt, "(objectClass=Group)", loadProps);
var results = srch.FindAll();

Ayarlamak için denedimsrch.= 2000; SizeLimitama çalışmak için görünmüyor. Herhangi bir fikir?

CEVAP
18 EYLÜL 2008, PERŞEMBE


DirectorySearcher ayarlamanız gerekir.Sıfır olmayan bir değer için tüm sonuçları almak için makinede.

BTW da bitince DirectorySearcher atılması gerekir

using(DirectorySearcher srch = new DirectorySearcher(dirEnt, "(objectClass=Group)", loadProps))
{
    srch.PageSize = 1000;
    var results = srch.FindAll();
}

API belgelerine çok net değil, ama esas olarak:

  • çağrı bir arama yaptığınızda, SizeLimit göz ardı edilir, ve tüm eşleşen sonuçlar FindAll tarafından döndürülen arasında yineleme gibi döndürülür. Sonuçlar aynı anda sunucudan bir sayfa alınır. Yukarıda 1000 değerini seçtim, ancak tercih eğer daha küçük bir değer kullanabilirsiniz. Bedeli: küçük bir Makinede sonuçlarını kullanarak her sayfa daha hızlı dönüş, ama sonuçları çok sayıda yineleme olduğunda sunucuya daha sık görüşmeleri gerekir.

  • varsayılan olarak arama, disk belleği = 0 Makinede () değil. Bu durumda SizeLimit sonuçları döndürülür.

Biri de belirttiği gibi, önemli SearchResultCollection FindAll, aksi TechNet belgelerine Açıklamalar bölümünde açıklandığı gibi bir bellek sızıntısı olabilir tarafından döndürülen imha etmek için DirectorySearcher.FindAll: http://msdn.microsoft.com/en-us/library/system.directoryservices.directorysearcher.findall.aspx

Bir şekilde bunu önlemek yardımcı olmak için .NET 2.0 veya daha sonra otomatik olarak SearchResultCollection hizmetinde kapsayıcı bir yöntem yazmak. Bu aşağıdaki gibi bir şey (ya da uzantısı bir yöntem olabilir .NET 3.5):

public IEnumerable<SearchResult> SafeFindAll(DirectorySearcher searcher)
{
    using(SearchResultCollection results = searcher.FindAll())
    {
        foreach (SearchResult result in results)
        {
            yield return result;        
        } 
    } // SearchResultCollection will be disposed here
}

Sonra da aşağıdaki gibi bu kullanabilirsiniz

using(DirectorySearcher srch = new DirectorySearcher(dirEnt, "(objectClass=Group)", loadProps))
{
    srch.PageSize = 1000;
    var results = SafeFindAll(srch);
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Marques Brownlee

    Marques Brow

    21 Mart 2008
  • New Scientist

    New Scientis

    27 Kasım 2006
  • pjtoohot

    pjtoohot

    15 NİSAN 2008

İLGİLİ SORU / CEVAPLAR