Как создать управляемый путь с помощью объектной модели 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 - это процедура Sub, содержащая приведенный выше образец кода.

Затем возникает ошибка InvalidOperationException: «Операция недопустима из-за текущего состояния объекта».

Где я ошибаюсь?

Один обходной путь, который мне удалось сделать, - это вызвать STSADM.EXE через Process.Start (), указав необходимые параметры, и это сработает.

Обновление: во время разработки веб-службы я запускаю ее с помощью встроенного веб-сервера Visual Studio 2005 - в каком контексте безопасности это будет выполняться? Могу ли я изменить контекст безопасности, поместив записи в web.config?

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


person Jazza    schedule 09.12.2008    source источник


Ответы (3)


Обновление. Думаю, вы доказали, что проблема не в коде.

SPSecurity.RunWithElevatedPrivileges: обычно код в веб-приложении SharePoint выполняется с правами пользователя, выполняющего действие. RunWithElevatedPrivileges запускает код в контексте учетной записи пулов веб-приложений SharePoint (я думаю) Описание на MSDN может немного углубиться в детали.

Проблема с вызовом может заключаться в том, что веб-служба на самом деле не выполняет код в процессе SharePoint, поэтому объясняется, почему он не может повышаться (предупреждение о предположении).

Попробуйте сменить пользователя пула приложений веб-служб и посмотрите, доставит ли это хоть какое-то удовольствие.


Вероятно, это проблема с разрешениями. Может попробовать:

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

Это не точный код.

person Nat    schedule 09.12.2008
comment
SPWebApplication не реализует IDisposable, поэтому вы не можете использовать конструкцию Using / End Using. Просто используйте вместо этого Dim. - person Jazza; 10.12.2008
comment
Метод SPWebApplication.Lookup принимает абсолютный Uri (myintranet / clients / sampleclient), но для добавления управляемого пути вы нужен относительный Uri (клиенты / образецклиент). - person Jazza; 10.12.2008
comment
Nat - даже после внесения незначительных изменений в код (см. Комментарии выше) я все равно получаю ту же ошибку проверки. Есть еще предложения? - person Jazza; 10.12.2008

Поскольку приведенный выше код не является точным кодом, вот точный рабочий код для ограниченной функции веб-приложения в событии Feature Activated:

При активации функции на странице функций веб-приложения Mange функция активации создаст новый явный управляемый путь в указанном веб-приложении (я хочу заменить жесткую кодировку, возможно, на Properties.Feature.Parent или что-то подобное).

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);
    }
}

Код, вероятно, можно улучшить, но это моя попытка преобразовать приведенный выше код.

person Eric Schrader    schedule 21.02.2011

Если вы хотите создать управляемый путь (явный) и семейство сайтов по этому пути, сделайте следующее:

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;
                    }
                }
            }
person Eric Schrader    schedule 21.02.2011
comment
Спасибо, Эрик. Я не в состоянии проверить это прямо сейчас, потому что прошло некоторое время с тех пор, как я разместил вопрос. - person Jazza; 23.02.2011