这是一个 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 管理员的成员。