Вопрос

Мне было интересно, есть ли какой-то способ, которым я могу получить объект SPSiteCollection, используя URL +, если я могу выбрать его, используя ключевое слово «Использование».

Я хочу пройти через все SPWebaplications в местной ферме, а затем каждая SiteCollection, его сайт и все соответствующие подделки.

Я могу сделать это, но ресурсы памяти слишком много используются, все, что я на самом деле пытаюсь сделать, это создать сценарий разминки SharePoint в приложении консоли.

                   class Program
{
    public static ArrayList siteCollArray = new ArrayList();
    public static ArrayList FailedURLs = new ArrayList();
    public static ArrayList URLs = new ArrayList();
    public static InitValues initVals = new InitValues();
    public static Log log = new Log();

    static void Main(string[] args)
    {
        log.AddeventLog("Started running at " + DateTime.Now.ToString() + " " + "Running on the system " + System.Environment.MachineName

);

    GetSiteCollections();
    GetSubWebs();
    GetWebPage();

    foreach(string url in FailedURLs)
    {
        Console.WriteLine(url);
    }

    SendEmail();
}

private static void GetSiteCollections()
{
    try
    {
        SPFarm farm = SPFarm.Local;
        SPWebService service = farm.Services.GetValue<SPWebService>("");

        foreach (SPWebApplication webApp in service.WebApplications)
        {
            foreach (SPSite currentsite in webApp.Sites)
            {
                SiteCollection newSite = new SiteCollection(currentsite.Url, initVals.verbose);
                siteCollArray.Add(newSite);
            }
        }
    }
    catch (Exception ex)
    {
        log.AddeventLog("Error getting SiteCollections off Sharepoint Farm. Exception: " + ex.ToString());
    }
}

private static void GetSubWebs()
{
    try
    {
        foreach (SiteCollection currentSite in siteCollArray)
        {
            ArrayList subWebs = currentSite.subWebs;
            foreach (string URL in subWebs)
            {
                URLs.Add(URL);
            }
        }
    }
    catch (Exception ex)
    {
        log.AddeventLog("Error getting SubWebs off Site Collection. Exception: " + ex.ToString());
    }
}

public static void GetWebPage()
{
    foreach (String URL in URLs)
    {
        try
        {
            WebRequest request = WebRequest.Create(URL);
            request.Proxy = null;

            if ((initVals.userName == null) || (initVals.userName == ""))
            {
                request.Credentials = CredentialCache.DefaultCredentials;
            }
            else
            {
                CredentialCache myCache = new CredentialCache();
                myCache.Add(new Uri(URL), initVals.authType, new NetworkCredential(initVals.userName, initVals.password, initVals.domain));
                request.Credentials = myCache;
            }

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Console.WriteLine(response.StatusDescription);
            using (Stream dataStream = response.GetResponseStream())
            using (StreamReader reader = new StreamReader(dataStream))
            {

                string responseFromServer = reader.ReadToEnd();
                reader.Close();
                dataStream.Close();
                response.Close();
            }
        }
        catch (Exception ex)
        {
            log.AddeventLog("Web Url: " + URL + " &  Exception Message: " + ex.Message.ToString());
            FailedURLs.Add(URL);
        }
    }
}
.

ВНИМАНИЕ! Это не полный код, но достаточно, чтобы продемонстрировать то, что я пытаюсь сделать, и главная проблема - утечка памяти.

Приветствия

Это было полезно?

Решение

Instead of collecting all the SiteCollections and then all the Site I'd run though all in one sweep, collect the Url and deallocate when done with each:

In Main:

foreach (SPWebApplication webApp in service.WebApplications) 
{ 
  foreach (SPSite currentsite in webApp.Sites) 
  { 
    ProcessWeb(currentsite.RootWeb);
    currentsite.Dispose();
  } 
} 

In ProcessWeb:

URLs.Add(currentWeb.Url);
try
{
  foreach (SPWeb web in currentWeb.Webs)
  {
     ProcessWeb(web);
  }
}
catch ...
finally
{
  currentWeb.Dispose();
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с sharepoint.stackexchange
scroll top