Как создать управляемый путь с помощью объектной модели SharePoint

StackOverflow https://stackoverflow.com/questions/352350

Вопрос

Это вопрос к гуру 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.

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

Решение

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

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

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

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

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

При активации функции на странице функций веб-приложения 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);
    }
}

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

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

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", "eric.schrader@6sc.com");
                    }
                    catch (Exception ex)
                    {
                        //ex.ToString;
                    }
                }
            }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top