Какой правильный способ развертывания решений в Foundation 2010 через C # API
-
09-12-2019 - |
Вопрос
Я нахожусь в команде, разработающей «портал» для Foundation SharePoint 2010. Я несу ответственность за создание установщика, который устанавливает новый экземпляр SharePoint. Он обрабатывает больше, чем просто установка файлов решений и конфигурации SharePoint. Установщик обрабатывает развертывание файлов в GAC и создает наш федеративный клиент Security (используется для наших претензий на основе SharePoint Authors).
Во время установки экземпляра я выполняю несколько задач, которые специально относятся к SharePoint и используют API SharePoint API в .NET 3.5:
- Создать / настроить доверие
- Создать веб-приложение.
- Развертывание решений для фермы и веб-приложения
- Создать коллекцию сайта по умолчанию
- Активировать функции по умолчанию на коллекции сайта
- Обновление веб-приложения "Свойства"
Вы знаете, я смог правильно установить работу на одном сервере 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:
.
- Как развернуть пакет решения SharePoint 2010 Использование Windows PowerShell
- Развертывание Пакет решений SharePoint 2010 с использованием PowerShell
- Развертывание решения SharePoint 2010 с PowerShell
Добавление и развертывание решений с PowerShell в SharePoint 2010 И вот информация о активации функций в PowerShell:
.
- Установка или удаление функций
- Активация и деактивация функций с PowerShell в SharePoint 2010
Чтобы ответить на ваш конкретный вопрос, можно активировать функцию в C #:
.Guid fDefId = new Guid(fDef.ID); site.Features.Add(fDefId);
Для получения дополнительной информации см. В разделе spsite.features And and spfeaturecollection.add .
Другие советы
Чтобы быть полностью честным, я больше никогда не увижу точку, делая что-нибудь в коде, что я могу сделать с помощью 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
.
Тогда ...
Активировать функции
Параметры решения установки
Применить основной шаблон
Создать саб сайты
Создание списков
Добавить веб-части
Установить разрешения
Скрыть / показать навигацию и столбцы
Добавьте любые данные для развертывания требуются
Готово
Мне пришлось много проблем, пытающихся развернуть решение, используя метод, который вы используете (просто поиск я разместил здесь и не нашел решения)