Как создать управляемый путь через объектную модель 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.

156   3  

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", "eric.schrader@6sc.com");
                    }
                    catch (Exception ex)
                    {
                        //ex.ToString;
                    }
                }
            }
    Ничего не найдено.

Добавить ответ:
Отменить.