Как создать управляемый путь через объектную модель SharePoint
Это вопрос для гуру WSS / SharePoint.
Рассмотрим такой сценарий: у меня есть ASP.Net веб-сервис, который связывает нашу корпоративную CRM-систему и WSS-интранет вместе. Я пытаюсь создать новое семейство веб-сайтов WSS всякий раз, когда новый клиент добавляется в CRM-систему. Чтобы выполнить эту работу, мне нужно программно добавить управляемый путь к новому семейству сайтов. Я знаю, что это возможно с помощью объектной модели, но когда я пробую это в моем собственном веб-сервисе, он терпит неудачу. Ниже приведен пример извлечения кода:
Dim _ClientSiteUrl As String = "http://myintranet/clients/sampleclient"
Using _RootWeb As SPSite = New SPSite("http://myintranet")
Dim _ManagedPaths As SPPrefixCollection = _RootWeb.WebApplication.Prefixes
If Not (_ManagedPaths.Contains(_ClientSiteUrl)) Then
_ManagedPaths.Add(_ClientSiteUrl, SPPrefixType.ExplicitInclusion)
End If
End Using
Этот код завершается ошибкой с NullReferenceException на SPUtility.ValidateFormDigest (). Исследования показали, что это может быть связано с недостаточными привилегиями, я попытался запустить код в блоке повышенных привилегий с помощью SPSecurity.RunWithElevatedPrivileges (AddressOf AddManagedPath), где AddManagedPath-это вложенная процедура, содержащая приведенный выше пример кода.
Это затем завершается ошибкой с InvalidOperationException, " операция недопустима из-за к текущему состоянию объекта."
Где я ошибаюсь?
Один обходной путь, который мне удалось сделать, - это вызвать STSADM.EXE через процесс.Start (), поставляя необходимые параметры, и это работает.
Update: при разработке веб-службы я запускаю ее с помощью встроенного веб-сервера Visual Studio 2005 - в каком контексте безопасности это будет выполняться? Можно ли изменить контекст безопасности, поместив записи в сеть.конфиг?
Update: я думаю, что проблема определенно связана с тем, что веб-служба не запускается в правильном контексте безопасности SharePoint. Я решил пойти с обходным путем, который я предложил, и выложить STSADM, хотя для этого идентификатор пула приложений, под которым работает веб-служба, должен быть членом администраторов SharePoint.
3 ответов:
Обновление Я думаю, вы доказали, что проблема не в коде.
SPSecurity.RunWithElevatedPrivileges: обычно код в веб-приложении SharePoint выполняется с правами пользователя, выполняющего действие. RunWithElevatedPrivileges запускает код в контексте учетной записи пулов веб-приложений SharePoint (я думаю) В описании на MSDN можно было бы немного подробнее остановиться на деталях.
Проблема с вызовом может заключаться в том, что сеть служба фактически не выполняет код в рамках процесса SharePoint, поэтому объяснение, почему она не может повысить уровень (предупреждение wild guess).
Попробуйте изменить пользователя пула приложений веб-служб и посмотрите, принесет ли это какую-либо радость.
Скорее всего, это проблема с разрешениями. Может быть, попробуем:
Dim clientSiteUrl As String = "http://myintranet/clients/sampleclient" Using SPSite = new SPSite(clientSiteUrl) webApp As SPWebApplication = SPWebApplication.Lookup(new Uri(clientSiteUrl)); If Not (webApp.Prefixes.Contains(clientSiteUrl)) Then webApp.Prefixes.Add(clientSiteUrl, SPPrefixType.ExplicitInclusion) End If End UsingЭто не точный код.
Поскольку приведенный выше код не является точным кодом, вот точный рабочий код для функции веб-приложения, скопированной в событии активации функции:
При активации функции на странице функций веб-приложения Mange функция activate создаст новый явный управляемый путь в указанном веб-приложении(я хочу заменить жесткую кодировку, возможно, свойствами.Особенность.Родитель или что-то подобное.)
using (SPSite site = new SPSite("http://dev-moss07-eric/PathHere")) { SPWebApplication webApp = SPWebApplication.Lookup(new Uri("http://dev-moss07-eric")); if (webApp.Prefixes.Contains("PathHere")) { // } else { webApp.Prefixes.Add("PathHere", SPPrefixType.ExplicitInclusion); } }Код, вероятно, можно улучшить, но это моя попытка преобразования приведенный выше код.
Если вы хотите создать управляемый путь (явный) и семейство сайтов на этом пути, выполните следующие действия:
using (SPSite site = new SPSite("http://dev-moss07-eric")) { SPWebApplication webApp = SPWebApplication.Lookup(new Uri("http://dev-moss07-eric")); if (webApp.Prefixes.Contains("ManagedPathHere")) { // } else { webApp.Prefixes.Add("ManagedPathHere", SPPrefixType.ExplicitInclusion); } using (SPWeb web = site.OpenWeb()) { SPWebApplication webApplication = web.Site.WebApplication; try { webApplication.Sites.Add("ManagedPathHere","Site Title Here","This site is used for hosting styling assets.", 1033, "STS#1", "6scdev\\eric.schrader", "Eric Schrader", "[email protected]"); } catch (Exception ex) { //ex.ToString; } } }
Comments