Как создать управляемый путь с помощью объектной модели SharePoint - PullRequest
2 голосов
/ 09 декабря 2008

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

Ответы [ 3 ]

1 голос
/ 22 февраля 2011

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

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

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

1 голос
/ 10 декабря 2008

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

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

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

0 голосов
/ 22 февраля 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", "eric.schrader@6sc.com");
                    }
                    catch (Exception ex)
                    {
                        //ex.ToString;
                    }
                }
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...