如何通过SharePoint对象模型创建托管路径

时间:2008-12-09 10:39:41

标签: sharepoint object model managed path

这是一个WSS / SharePoint大师的问题。

考虑这种情况:我有一个ASP.Net Web服务,它将我们的企业CRM系统和基于WSS的Intranet连接在一起。我想要做的是每当将新客户端添加到CRM系统时提供新的WSS网站集。为了使这项工作,我需要以编程方式将管理路径添加到新网站集。我知道这可以通过对象模型实现,但是当我在自己的Web服务中尝试它时,它会失败。示例代码摘录如下:


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

此代码在SPUtility.ValidateFormDigest()上出现NullReferenceException失败。研究表明,这可能是由于权限不足,我尝试使用SPSecurity.RunWithElevatedPrivileges(AddressOf AddManagedPath)在提升的权限块内运行代码,其中AddManagedPath是包含上述代码示例的Sub过程。

然后失败并出现InvalidOperationException,“由于对象的当前状态,操作无效。”

我哪里错了?

我设法做的一个解决方法是通过Process.Start()调用STSADM.EXE,提供必要的参数,这样就可以了。

更新:在开发Web服务时,我使用内置的Visual Studio 2005 Web服务器运行它 - 这将运行什么安全上下文?我可以通过在web.config中添加条目来更改安全上下文吗?

更新:我认为问题肯定与未在正确的SharePoint安全上下文中运行Web服务有关。我决定采用我建议的解决方法并将其发送到STSADM,但为此,运行Web服务的应用程序池标识必须是SharePoint管理员的成员。

3 个答案:

答案 0 :(得分:1)

<强>更新 我想你已经证明问题不在于代码。

SPSecurity.RunWithElevatedPrivileges:通常,SharePoint Web应用程序中的代码使用执行操作的用户的权限执行。 RunWithElevatedPrivileges在SharePoint Web应用程序池帐户的上下文中运行代码(我认为) 关于MSDN的描述可以更详细地介绍细节。

调用的问题可能是Web服务实际上并未在SharePoint进程中运行代码,因此解释了无法提升的原因(疯狂猜测警报)。

无法更改Web服务应用程序池的用户,看看是否能带来任何乐趣。


可能是权限问题。 也许试试:

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

这不是确切的代码。

答案 1 :(得分:1)

由于上面的代码不是确切的代码,因此以下是Feature Activated事件中Web Application scopped功能的确切工作代码:

在Mange Web应用程序功能页面上的功能激活时,激活功能将在指定的Web应用程序中创建一个新的显式管理路径(我想替换硬编码,可能使用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);
    }
}

代码可能会有所改进,但我尝试转换上面的代码。

答案 2 :(得分:0)

如果要在该路径上创建托管路径(显式)和网站集,请执行以下操作:

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