Какой правильный способ развертывания решений в Foundation 2010 через C # API

sharepoint.stackexchange https://sharepoint.stackexchange.com//questions/44918

Вопрос

Я нахожусь в команде, разработающей «портал» для Foundation SharePoint 2010. Я несу ответственность за создание установщика, который устанавливает новый экземпляр SharePoint. Он обрабатывает больше, чем просто установка файлов решений и конфигурации SharePoint. Установщик обрабатывает развертывание файлов в GAC и создает наш федеративный клиент Security (используется для наших претензий на основе SharePoint Authors).

Во время установки экземпляра я выполняю несколько задач, которые специально относятся к SharePoint и используют API SharePoint API в .NET 3.5:

  1. Создать / настроить доверие
  2. Создать веб-приложение.
  3. Развертывание решений для фермы и веб-приложения
  4. Создать коллекцию сайта по умолчанию
  5. Активировать функции по умолчанию на коллекции сайта
  6. Обновление веб-приложения "Свойства"

    Вы знаете, я смог правильно установить работу на одном сервере SharePoint, то есть один сервер продвигается в базе данных фермы, а другая - полная стопка SharePoint Services. Я начал тестирование с установкой, которая будет имитировать настроить реальную мир SharePoint в нашей среде хостинга. Там у нас есть сервер базы данных и как минимум три сервера SharePoint, только один из которых имеет центральное администрирование.

    Проблема, в которой я запускаю, это то, что в этом случае я могу правильно, и без каких-либо ошибок выполняют все шаги выше, кроме активации функций. Я удалил код, который делает этот шаг, и проверил, что веб-приложение, коллекция сайтов, доверие и т. Д. (За исключением «свойств»), были созданы правильно, запустив сайт, аутентификацию, и увидев тему по умолчанию «Team». Отказ Однако, как только я активирую функции по умолчанию, либо через API, либо через настройки сбора сайта, я больше не могу получить доступ к сайту и получать ошибку.

    Это приходит к сургу моей проблемы и проблема, с которой я сталкиваюсь, когда объясняю его здесь. Наше решение очень сложно в том, что он включает в себя большую конфигурацию от аспектов безопасности и зависимости от других услуг за пределами SharePoint. Я не знаю, если некоторые наши настройки не распространяются через серверы, вызывающие внутреннюю ошибку в нашем решении, чтобы вызвать страницу ошибки. Я также не знаю, если когда я устанавливаю «свойства», если они придерживаются ситуации на ферме. У меня была проблема, где я не устанавливаю это прямо, когда я впервые начал на этой задаче, и это вызвало проблему, похожую на то, что я вижу сейчас.

    Я также не уверен, если решения правильно развернуты, поэтому повреждают функции. Я настроил Viewer TOLS на каждом из серверов SharePoint, но я не могу найти все, что относятся к идентификатору корреляции для ошибки, которую я получаю на странице об ошибке. Я на самом деле не получаю никаких событий в Viewer ULS на «Master» SharePoint Server. Я могу видеть развертывание и убрать растворы в зрителе на двух других серверах.

    Я должен пропустить то, что происходит на ферме с несколькими серверами. Я надеюсь, что кто-то может взглянуть на бит кода, который я использую для развертывания решений и установить свойства, чтобы помочь мне. Я также хотел бы понять, почему я не могу видеть ошибку, которую я получаю в каком-либо из зрителей ULS. Может кто-нибудь объяснить это для меня?

    Также я ищу более окончательные примеры того, как настроить и настроить SharePoint через API C #. До этого момента я разделил код для командЛетов и реплицируя то, что я могу в коде. У меня до сих пор нет «правильного» способа активизации функции через C # и просто создаю процесс, запущенную stsadm.exe, чтобы активировать функции.

    Вот мой код для добавления и развертывания решения:

          SPSolution newSolution = SPFarm.Local.Solutions.Add(Path.Combine(this.SharePointPointRootFolder, solutionDefinition.filename));
    
          if (!solutionDefinition.webApplicationSpecific)
          {
            Console.WriteLine("Adding a farm specific solution.");
    
            newSolution.Deploy(DateTime.Now, true, true);
    
            this.WaitForSolutionJobsToComplete(newSolution.Id);
    
            newSolution.Synchronize();
          }
          else //specific to a web application.  Load the new solution.
          {
            Console.WriteLine("Adding web application specific solution.");
    
            Collection<SPWebApplication> webAppCol = new Collection<SPWebApplication>();
            webAppCol.Add(this.WebApplication);
    
            newSolution.Deploy(DateTime.Now, true, webAppCol, true);
    
            this.WaitForSolutionJobsToComplete(newSolution.Id);
    
            newSolution = SPFarm.Local.GetObject(newSolution.Id) as SPSolution;
    
            newSolution.Synchronize();
    
            this.WaitForSolutionJobsToComplete(newSolution.Id);
    
            newSolution.Update();
          }
    
    .

    Вот мой код для активации функций. Он просто использует процесс для использования STSADM.EXE:

    void UpdateFeatures(SPSite site)
    {
      Console.WriteLine("Updating features.");
    
      SPSolutionDefinitionCollection collection = SolutionConfigurer.LoadSolutionDefinitions();
    
      foreach (SPSolutionDefinition solutionDefinition in collection.spSolutionDefinition)
      {
    
        Guid id = new Guid(solutionDefinition.ID);
    
        if (solutionDefinition.spFeatureDefinition != null && solutionDefinition.spFeatureDefinition.Length > 0)
        {
          foreach (Models.SPFeatureDefinition fDef in solutionDefinition.spFeatureDefinition)
          {
            Guid fDefId = new Guid(fDef.ID);
    
            //this.Activate(fDefId, site);
    
            Process stsadmP = WebApplicationConfigurer.GetSTSADMProcess(this.STSADMPath, "-o activatefeature -id " + fDef.ID + " -url " + this.SiteCollectionUrl + " -force");
    
            Console.WriteLine(string.Format("Invoking STSADM.EXE for feature deployment: {0} with arguments:{1}", stsadmP.StartInfo.FileName, stsadmP.StartInfo.Arguments));
    
            stsadmP.Start();
            stsadmP.WaitForExit();
    
            if (stsadmP.ExitCode == 0)
            {
              Console.WriteLine(string.Format("STSADM.EXE successfully ran for feature id {0} and produced this output: {1}", fDefId, stsadmP.StandardOutput.ReadToEnd()));
            }
            else
            {
              Console.WriteLine(string.Format("STSADM.EXE did not produce a successful exit code for feature id {0} and produced this output: {1} + {2}", fDefId, 
                stsadmP.StandardOutput.ReadToEnd(), stsadmP.StandardError.ReadToEnd()));
            }
          }
        }
      }
    }
    
    .

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

    public void UpdatePropertiesWebApplication()
    {
      string dnsName = this.SigningCertificate.GetNameInfo(X509NameType.DnsName, false);
    
      SPWebApplication webApplication = SPFarm.Local.GetObject(this.WebApplicationId) as SPWebApplication;
    
      if (webApplication != null)
      {
        Console.WriteLine("Updating property information for the web application.");
    
        if (!webApplication.Properties.ContainsKey(Constants.PropertyBagKeys.ESB_ROOT))
        {
          webApplication.Properties.Add(Constants.PropertyBagKeys.ESB_ROOT, this.ESBUrl);
        }
        else
        {
          Console.WriteLine("Updating ESB Root URL. " + this.ESBUrl);
          webApplication.Properties[Constants.PropertyBagKeys.ESB_ROOT] = this.ESBUrl;
        }
    
        Console.WriteLine("ESB Root Url: " + webApplication.Properties[Constants.PropertyBagKeys.ESB_ROOT]);
    
        if (!webApplication.Properties.ContainsKey(Constants.PropertyBagKeys.REALM))
        {
          webApplication.Properties.Add(Constants.PropertyBagKeys.REALM, this.SharePointTrustPoint);
        }
        else
        {
          Console.WriteLine("Updating realm. " + this.SharePointTrustPoint);
          webApplication.Properties[Constants.PropertyBagKeys.REALM] = this.SharePointTrustPoint;
        }
    
        Console.WriteLine("Realm: " + webApplication.Properties[Constants.PropertyBagKeys.REALM]);
    
        if (!webApplication.Properties.ContainsKey(Constants.PropertyBagKeys.SSO_ROOT))
        {
          webApplication.Properties.Add(Constants.PropertyBagKeys.SSO_ROOT, this.SSOUrl);
        }
        else
        {
          Console.WriteLine("Updating the broker url. " + this.SSOUrl);
          webApplication.Properties[Constants.PropertyBagKeys.SSO_ROOT] = this.SSOUrl;
        }
    
        Console.WriteLine("Broker Url: " + webApplication.Properties[Constants.PropertyBagKeys.SSO_ROOT]);
    
        if (!webApplication.Properties.ContainsKey(Constants.PropertyBagKeys.TRUSTED_CERT_DNS_IDENT))
        {
          webApplication.Properties.Add(Constants.PropertyBagKeys.TRUSTED_CERT_DNS_IDENT, dnsName);
        }
        else
        {
          Console.WriteLine("Updating trusted cert dns identity. " + dnsName);
          webApplication.Properties[Constants.PropertyBagKeys.TRUSTED_CERT_DNS_IDENT] = dnsName;
        }
    
        Console.WriteLine("Trusted Certificate Identity: " + webApplication.Properties[Constants.PropertyBagKeys.TRUSTED_CERT_DNS_IDENT]);
    
        webApplication.Update(true);
      }
    }
    
    .

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

Решение

Чтобы ответить на ваш общий вопрос, рекомендуемый способ развертывания решения в SharePoint 2010 - использовать PowerShell.

from Что нового: Windows PowerShell для SharePoint :

Windows PowerShell заменяет инструмент администрирования STSADM.EXE. Движение вперед, вы должны использовать технологию сценариев Windows PowerShell для разработки любых новых сценариев командной строки в Foundation SharePoint 2010.

Вот некоторые образцы и скрипты для развертывания с PowerShell:

Другие советы

Чтобы быть полностью честным, я больше никогда не увижу точку, делая что-нибудь в коде, что я могу сделать с помощью STSADM напрямую.

Так что я всегда просто использую эквивалент тому, что мне требуется:

stsadm -o deletesolution -name solution.wsp -override
stsadm -o addsolution -filename c:\path\solution.wsp
stsadm -o deploysolution -name solution.wsp -allowgacdeployment -local -force
.

Тогда ...

Активировать функции

Параметры решения установки

Применить основной шаблон

Создать саб сайты
Создание списков

Добавить веб-части

Установить разрешения
Скрыть / показать навигацию и столбцы

Добавьте любые данные для развертывания требуются

Готово

Мне пришлось много проблем, пытающихся развернуть решение, используя метод, который вы используете (просто поиск я разместил здесь и не нашел решения)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с sharepoint.stackexchange
scroll top