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