2

这是一个 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 是包含上述代码示例的子过程。

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

我哪里错了?

我设法做的一种解决方法是通过 Process.Start() 调用 STSADM.EXE,提供必要的参数,这很有效。

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

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

4

3 回答 3

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

这不是确切的代码。

于 2008-12-09T21:14:43.547 回答
1

由于上面的代码不是确切的代码,这里是功能激活事件中 Web 应用程序范围内的功能的确切工作代码:

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

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

于 2011-02-21T22:01:47.077 回答
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;
                    }
                }
            }
于 2011-02-21T23:41:02.513 回答