Правильный способ избавиться от вашего нового SPWeb
находится в области, где он был создан. Если вам необходимо выполнить дополнительные операции в новой сети, просто передайте делегата для вызова:
public static void CreateSiteFromSTP(SPWeb parentWeb, string newSiteSTP, int teamId, Action<SPWeb> actionOnCreate)
{
// ...
using(var newWeb = webs.Add(...))
{
// ...
newWeb.Update();
actionOnCreate(newWeb);
}
}
Затем вы можете просто передать метод (анонимный или именованный), который манипулирует вашим новым SPWeb
, без ответственности за его распространение. Этот подход также имеет то преимущество, что не требует возврата SPWeb
за пределы вашего повышенного блока, что не поддерживается и ненадежно.
На самом деле, я был бы удивлен, обнаружив, что ваш код на самом деле работает так, как вы предполагаете: существующие объекты SharePoint (в частности, parentWeb
) имеют свои права доступа, установленные при их создании, и их также нельзя передавать в контекст с повышенными правами. Лучшим подходом для повышения разрешений в SharePoint является использование олицетворения SPSite. Используя RunAsSystem
метод, определенный здесь , я бы изменил ваш код следующим образом:
public static void ElevateToCreateSiteFromSTP(SPWeb parentWeb, string newSiteSTP, int teamId, Action<SPWeb> actionOnCreate)
{
parentWeb.RunAsSystem(elevWeb =>
CreateSiteFromSTP(elevWeb, newSiteSTP, teamId, actionOnCreate));
}
private static void CreateSiteFromSTP(SPWeb parentWeb, string newSiteSTP, int teamId, Action<SPWeb> actionOnCreate)
{
try
{
string siteUrl = teamId.ToString();
SPWebCollection webs = parentWeb.Webs;
using(var newWeb = webs.Add(siteUrl, ...))
{
var newWebFeatures = newWeb.Features;
TraceProvider.WriteLine("Activating Feature : MembersFeature ");
newWebFeatures.Add(new Guid(TeamSiteAttributes.MembersFeature), true);
TraceProvider.WriteLine("Activating Feature : BadgeAwardsFeature ");
newWebFeatures.Add(new Guid(TeamSiteAttributes.BadgeAwardsFeature), true);
TraceProvider.WriteLine("Activating Feature : ProjectBenefitsFeature ");
newWebFeatures.Add(new Guid(TeamSiteAttributes.ProjectBenefitsFeature), true);
TraceProvider.WriteLine("Activating Feature : TeamScoreFeature ");
newWebFeatures.Add(new Guid(TeamSiteAttributes.TeamScoreFeature), true);
newWeb.Update();
parentWeb.Update();
if(actionOnCreate != null)
actionOnCreate(newWeb);
}
}
catch (Exception ex)
{
TraceProvider.WriteLine("Error", ex);
throw;
}
}
Это дает дополнительное преимущество, заключающееся в том, что ваши проблемы с высотами отличаются от логики для создания SPWeb
. Я также предпочитаю, чтобы было совершенно очевидно, где мой код будет работать с разными разрешениями.