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

如何通过SharePoint对象模型创建托管路径,sharepoint,object,model,managed,path,Sharepoint,Object,Model,Managed,Path,这是一个WSS/SharePoint专家的问题 考虑这个场景:我有一个ASP.NETWeb服务,它将我们的公司CRM系统和基于WSS的内部网连接在一起。我试图做的是在CRM系统中添加新客户端时提供一个新的WSS网站集。为了实现这一点,我需要以编程方式将托管路径添加到新网站集。我知道这可以通过对象模型实现,但当我在自己的web服务中尝试时,它失败了。示例代码摘录如下: Dim _ClientSiteUrl As String = "http://myintranet/clients/sample

这是一个WSS/SharePoint专家的问题

考虑这个场景:我有一个ASP.NETWeb服务,它将我们的公司CRM系统和基于WSS的内部网连接在一起。我试图做的是在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(AddManagedPath的地址)在提升的权限块中运行代码,其中AddManagedPath是包含上述代码示例的子过程

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

我哪里做错了

我已经设法解决的一个方法是通过Process.Start()调用STSADM.EXE,提供必要的参数,这是可行的

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

更新:我认为问题肯定与没有在正确的SharePoint安全上下文中运行web服务有关。我决定采用我建议的解决方案,并将其外包给STSADM,不过要做到这一点,web服务运行所依据的应用程序池标识必须是SharePoint管理员的成员。

更新 我想你已经证明了问题不在于代码

SPSecurity.RunWithElevatedPrivileges:通常,SharePoint web应用程序中的代码以执行操作的用户的权限执行。RunWithElevatedPrivileges在SharePoint web应用程序池帐户的上下文中运行代码(我认为) 上面的描述可以更详细一点

调用的问题可能是web服务实际上没有在SharePoint进程中运行代码,因此解释了它无法提升的原因(wild guess alert)

尝试更改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

这不是准确的代码。

由于上述代码不是准确的代码,以下是功能激活事件中Web应用程序范围内功能的准确工作代码:

在“管理web应用程序功能”页面的功能激活中,激活功能将在指定的web应用程序中创建一个新的显式托管路径(我想用Properties.feature.Parent或类似内容替换硬编码)


代码可能可以改进,但我尝试转换上述代码。

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

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

SPWebApplication未实现IDisposable,因此不能使用Using/End-Using构造。只需使用Dim即可。SPWebApplication.Lookup方法接受绝对Uri(),但要添加托管路径,需要相对Uri(clients/sampleclient.Nat)-即使在进行了一些小的代码更改(请参见上面的注释)之后,我仍然会收到相同的验证错误。还有什么建议吗?谢谢Eric。我现在无法测试这个问题,因为我发布这个问题已经有一段时间了。
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;
                    }
                }
            }