本文整理汇总了C#中Web.EnsureProperty方法的典型用法代码示例。如果您正苦于以下问题:C# Web.EnsureProperty方法的具体用法?C# Web.EnsureProperty怎么用?C# Web.EnsureProperty使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Web
的用法示例。
在下文中一共展示了Web.EnsureProperty方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: UpdateTemplateOnWeb
private void UpdateTemplateOnWeb(Web targetWeb, RefreshSitesJob job)
{
targetWeb.EnsureProperty(w => w.Url);
var infoJson = targetWeb.GetPropertyBagValueString(PnPPartnerPackConstants.PropertyBag_TemplateInfo, null);
if (!String.IsNullOrEmpty(infoJson))
{
Console.WriteLine($"Updating template for site: {targetWeb.Url}");
var info = JsonConvert.DeserializeObject<SiteTemplateInfo>(infoJson);
// If we have the template info
if (info != null && !String.IsNullOrEmpty(info.TemplateProviderType))
{
ProvisioningTemplate template = null;
// Try to retrieve the template
var templatesProvider = PnPPartnerPackSettings.TemplatesProviders[info.TemplateProviderType];
if (templatesProvider != null)
{
template = templatesProvider.GetProvisioningTemplate(info.TemplateUri);
}
// If we have the template
if (template != null)
{
// Configure proper settings for the provisioning engine
ProvisioningTemplateApplyingInformation ptai =
new ProvisioningTemplateApplyingInformation();
// Write provisioning steps on console log
ptai.MessagesDelegate += delegate (string message, ProvisioningMessageType messageType)
{
Console.WriteLine("{0} - {1}", messageType, messageType);
};
ptai.ProgressDelegate += delegate (string message, int step, int total)
{
Console.WriteLine("{0:00}/{1:00} - {2}", step, total, message);
};
// Exclude handlers not supported in App-Only
ptai.HandlersToProcess ^=
OfficeDevPnP.Core.Framework.Provisioning.Model.Handlers.TermGroups;
ptai.HandlersToProcess ^=
OfficeDevPnP.Core.Framework.Provisioning.Model.Handlers.SearchSettings;
// Configure template parameters
if (info.TemplateParameters != null)
{
foreach (var key in info.TemplateParameters.Keys)
{
if (info.TemplateParameters.ContainsKey(key))
{
template.Parameters[key] = info.TemplateParameters[key];
}
}
}
targetWeb.ApplyProvisioningTemplate(template, ptai);
// Save the template information in the target site
var updatedInfo = new SiteTemplateInfo()
{
TemplateProviderType = info.TemplateProviderType,
TemplateUri = info.TemplateUri,
TemplateParameters = template.Parameters,
AppliedOn = DateTime.Now,
};
var jsonInfo = JsonConvert.SerializeObject(updatedInfo);
targetWeb.SetPropertyBagValue(PnPPartnerPackConstants.PropertyBag_TemplateInfo, jsonInfo);
Console.WriteLine($"Updated template on site: {targetWeb.Url}");
// Update (recursively) all the subwebs of the current web
targetWeb.EnsureProperty(w => w.Webs);
foreach (var subweb in targetWeb.Webs)
{
UpdateTemplateOnWeb(subweb, job);
}
}
}
}
}
示例2: CanUseAcceptLanguageHeaderForLocalization
/// <summary>
/// Checks if replacing the "Accept-Language" header is allowed. This approach does not work when the user that's
/// making the call has set one or more languages in their user profile
/// </summary>
/// <param name="web">Current site</param>
/// <returns>True if the "Accept-Language" header approach can be used</returns>
private static bool CanUseAcceptLanguageHeaderForLocalization(Web web)
{
if (web.Context.IsAppOnly())
{
return true;
}
var currentUser = web.EnsureProperty(w => w.CurrentUser);
PeopleManager peopleManager = new PeopleManager(web.Context);
var languageSettings = peopleManager.GetUserProfilePropertyFor(web.CurrentUser.LoginName, "SPS-MUILanguages");
web.Context.ExecuteQueryRetry();
if (languageSettings == null || String.IsNullOrEmpty(languageSettings.Value))
{
return true;
}
return false;
}
示例3: ExtractObjects
public override ProvisioningTemplate ExtractObjects(Web web, ProvisioningTemplate template, ProvisioningTemplateCreationInformation creationInfo)
{
using (var scope = new PnPMonitoredScope(this.Name))
{
if (web.IsFeatureActive(PUBLISHING_FEATURE_WEB))
{
web.EnsureProperty(w => w.Language);
var webTemplates = web.GetAvailableWebTemplates(web.Language, false);
web.Context.Load(webTemplates, wts => wts.Include(wt => wt.Name, wt => wt.Lcid));
web.Context.ExecuteQueryRetry();
Publishing publishing = new Publishing();
publishing.AvailableWebTemplates.AddRange(webTemplates.AsEnumerable<WebTemplate>().Select(wt => new AvailableWebTemplate() { TemplateName = wt.Name, LanguageCode = (int)wt.Lcid }));
publishing.AutoCheckRequirements = AutoCheckRequirementsOptions.MakeCompliant;
publishing.DesignPackage = null;
publishing.PageLayouts.AddRange(GetAvailablePageLayouts(web));
template.Publishing = publishing;
}
}
return template;
}
示例4: TokenParser
public TokenParser(Web web, ProvisioningTemplate template)
{
web.EnsureProperties(w => w.ServerRelativeUrl, w => w.Language);
_web = web;
_tokens = new List<TokenDefinition>();
_tokens.Add(new SiteCollectionToken(web));
_tokens.Add(new SiteCollectionIdToken(web));
_tokens.Add(new SiteToken(web));
_tokens.Add(new MasterPageCatalogToken(web));
_tokens.Add(new SiteCollectionTermStoreIdToken(web));
_tokens.Add(new KeywordsTermStoreIdToken(web));
_tokens.Add(new ThemeCatalogToken(web));
_tokens.Add(new SiteNameToken(web));
_tokens.Add(new SiteIdToken(web));
_tokens.Add(new AssociatedGroupToken(web, AssociatedGroupToken.AssociatedGroupType.owners));
_tokens.Add(new AssociatedGroupToken(web, AssociatedGroupToken.AssociatedGroupType.members));
_tokens.Add(new AssociatedGroupToken(web, AssociatedGroupToken.AssociatedGroupType.visitors));
_tokens.Add(new GuidToken(web));
_tokens.Add(new DateNowToken(web));
_tokens.Add(new CurrentUserIdToken(web));
_tokens.Add(new CurrentUserLoginNameToken(web));
_tokens.Add(new CurrentUserFullNameToken(web));
_tokens.Add(new AuthenticationRealmToken(web));
// Add lists
web.Context.Load(web.Lists, ls => ls.Include(l => l.Id, l => l.Title, l => l.RootFolder.ServerRelativeUrl));
web.Context.ExecuteQueryRetry();
foreach (var list in web.Lists)
{
_tokens.Add(new ListIdToken(web, list.Title, list.Id));
_tokens.Add(new ListUrlToken(web, list.Title, list.RootFolder.ServerRelativeUrl.Substring(web.ServerRelativeUrl.Length + 1)));
}
if (web.IsSubSite())
{
// Add lists from rootweb
var rootWeb = (web.Context as ClientContext).Site.RootWeb;
rootWeb.EnsureProperty(w => w.ServerRelativeUrl);
rootWeb.Context.Load(rootWeb.Lists, ls => ls.Include(l => l.Id, l => l.Title, l => l.RootFolder.ServerRelativeUrl));
rootWeb.Context.ExecuteQueryRetry();
foreach (var rootList in rootWeb.Lists)
{
// token already there? Skip the list
if (web.Lists.FirstOrDefault(l => l.Title == rootList.Title) == null)
{
_tokens.Add(new ListIdToken(web, rootList.Title, rootList.Id));
_tokens.Add(new ListUrlToken(web, rootList.Title, rootList.RootFolder.ServerRelativeUrl.Substring(rootWeb.ServerRelativeUrl.Length + 1)));
}
}
}
// Add ContentTypes
web.Context.Load(web.AvailableContentTypes, cs => cs.Include(ct => ct.StringId, ct => ct.Name));
web.Context.ExecuteQueryRetry();
foreach (var ct in web.AvailableContentTypes)
{
_tokens.Add(new ContentTypeIdToken(web, ct.Name, ct.StringId));
}
// Add parameters
foreach (var parameter in template.Parameters)
{
_tokens.Add(new ParameterToken(web, parameter.Key, parameter.Value));
}
// Add TermSetIds
TaxonomySession session = TaxonomySession.GetTaxonomySession(web.Context);
var termStores = session.EnsureProperty(s => s.TermStores);
foreach (var ts in termStores)
{
_tokens.Add(new TermStoreIdToken(web, ts.Name, ts.Id));
}
var termStore = session.GetDefaultSiteCollectionTermStore();
web.Context.Load(termStore);
web.Context.ExecuteQueryRetry();
if (!termStore.ServerObjectIsNull.Value)
{
web.Context.Load(termStore.Groups,
g => g.Include(
tg => tg.Name,
tg => tg.TermSets.Include(
ts => ts.Name,
ts => ts.Id)
));
web.Context.ExecuteQueryRetry();
foreach (var termGroup in termStore.Groups)
{
foreach (var termSet in termGroup.TermSets)
{
_tokens.Add(new TermSetIdToken(web, termGroup.Name, termSet.Name, termSet.Id));
}
}
}
_tokens.Add(new SiteCollectionTermGroupIdToken(web));
_tokens.Add(new SiteCollectionTermGroupNameToken(web));
//.........这里部分代码省略.........
示例5: WillExtract
public override bool WillExtract(Web web, ProvisioningTemplate template, ProvisioningTemplateCreationInformation creationInfo)
{
if (!_willExtract.HasValue)
{
if (web.IsSubSite() && web.EnsureProperty(w => w.HasUniqueRoleAssignments))
{
_willExtract = true;
}
else
{
_willExtract = !web.IsSubSite();
}
}
return _willExtract.Value;
}
示例6: WillProvision
public override bool WillProvision(Web web, ProvisioningTemplate template)
{
if (!_willProvision.HasValue)
{
_willProvision = (template.Security.AdditionalAdministrators.Any() ||
template.Security.AdditionalMembers.Any() ||
template.Security.AdditionalOwners.Any() ||
template.Security.AdditionalVisitors.Any() ||
template.Security.SiteGroups.Any() ||
template.Security.SiteSecurityPermissions.RoleAssignments.Any() ||
template.Security.SiteSecurityPermissions.RoleDefinitions.Any());
if (_willProvision == true)
{
// if not subweb and site inheritance is not broken
if (web.IsSubSite() && web.EnsureProperty(w => w.HasUniqueRoleAssignments) == false)
{
_willProvision = false;
}
}
}
return _willProvision.Value;
}
示例7: GetTemplateFile
//TODO: Candidate for cleanup
private Model.File GetTemplateFile(Web web, string serverRelativeUrl)
{
var webServerUrl = web.EnsureProperty(w => w.Url);
var serverUri = new Uri(webServerUrl);
var serverUrl = string.Format("{0}://{1}", serverUri.Scheme, serverUri.Authority);
var fullUri = new Uri(System.UrlUtility.Combine(serverUrl, serverRelativeUrl));
var folderPath = fullUri.Segments.Take(fullUri.Segments.Count() - 1).ToArray().Aggregate((i, x) => i + x).TrimEnd('/');
var fileName = fullUri.Segments[fullUri.Segments.Count() - 1];
var templateFile = new Model.File()
{
Folder = Tokenize(folderPath, web.Url),
Src = fileName,
Overwrite = true,
};
return templateFile;
}
示例8: ApplyRemoteTemplate
/// <summary>
/// Actual implementation of the apply templates
/// </summary>
/// <param name="web"></param>
/// <param name="template"></param>
/// <param name="provisioningInfo"></param>
internal void ApplyRemoteTemplate(Web web, ProvisioningTemplate template, ProvisioningTemplateApplyingInformation provisioningInfo)
{
using (var scope = new PnPMonitoredScope(CoreResources.Provisioning_ObjectHandlers_Provisioning))
{
ProvisioningProgressDelegate progressDelegate = null;
ProvisioningMessagesDelegate messagesDelegate = null;
if (provisioningInfo != null)
{
if (provisioningInfo.OverwriteSystemPropertyBagValues == true)
{
scope.LogInfo(CoreResources.SiteToTemplateConversion_ApplyRemoteTemplate_OverwriteSystemPropertyBagValues_is_to_true);
}
progressDelegate = provisioningInfo.ProgressDelegate;
if (provisioningInfo.ProgressDelegate != null)
{
scope.LogInfo(CoreResources.SiteToTemplateConversion_ProgressDelegate_registered);
}
messagesDelegate = provisioningInfo.MessagesDelegate;
if (provisioningInfo.MessagesDelegate != null)
{
scope.LogInfo(CoreResources.SiteToTemplateConversion_MessagesDelegate_registered);
}
}
else
{
// When no provisioning info was passed then we want to execute all handlers
provisioningInfo = new ProvisioningTemplateApplyingInformation();
provisioningInfo.HandlersToProcess = Handlers.All;
}
// Check if the target site shares the same base template with the template's source site
var targetSiteTemplateId = web.GetBaseTemplateId();
if (!String.IsNullOrEmpty(targetSiteTemplateId) && !String.IsNullOrEmpty(template.BaseSiteTemplate))
{
if (!targetSiteTemplateId.Equals(template.BaseSiteTemplate, StringComparison.InvariantCultureIgnoreCase))
{
var templatesNotMatchingWarning = String.Format(CoreResources.Provisioning_Asymmetric_Base_Templates, template.BaseSiteTemplate, targetSiteTemplateId);
scope.LogWarning(templatesNotMatchingWarning);
if (provisioningInfo.MessagesDelegate!= null)
{
provisioningInfo.MessagesDelegate(templatesNotMatchingWarning, ProvisioningMessageType.Warning);
}
}
}
// Always ensure the Url property is loaded. In the tokens we need this and we don't want to call ExecuteQuery as this can
// impact delta scenarions (calling ExecuteQuery before the planned update is called)
web.EnsureProperty(w => w.Url);
List<ObjectHandlerBase> objectHandlers = new List<ObjectHandlerBase>();
if (provisioningInfo.HandlersToProcess.HasFlag(Handlers.RegionalSettings)) objectHandlers.Add(new ObjectRegionalSettings());
if (provisioningInfo.HandlersToProcess.HasFlag(Handlers.SupportedUILanguages)) objectHandlers.Add(new ObjectSupportedUILanguages());
if (provisioningInfo.HandlersToProcess.HasFlag(Handlers.AuditSettings)) objectHandlers.Add(new ObjectAuditSettings());
if (provisioningInfo.HandlersToProcess.HasFlag(Handlers.SitePolicy)) objectHandlers.Add(new ObjectSitePolicy());
if (provisioningInfo.HandlersToProcess.HasFlag(Handlers.SiteSecurity)) objectHandlers.Add(new ObjectSiteSecurity());
if (provisioningInfo.HandlersToProcess.HasFlag(Handlers.Features)) objectHandlers.Add(new ObjectFeatures());
if (provisioningInfo.HandlersToProcess.HasFlag(Handlers.TermGroups)) objectHandlers.Add(new ObjectTermGroups());
if (provisioningInfo.HandlersToProcess.HasFlag(Handlers.Fields) || provisioningInfo.HandlersToProcess.HasFlag(Handlers.Lists)) objectHandlers.Add(new ObjectField());
if (provisioningInfo.HandlersToProcess.HasFlag(Handlers.ContentTypes)) objectHandlers.Add(new ObjectContentType());
if (provisioningInfo.HandlersToProcess.HasFlag(Handlers.Lists)) objectHandlers.Add(new ObjectListInstance());
if (provisioningInfo.HandlersToProcess.HasFlag(Handlers.Fields) || provisioningInfo.HandlersToProcess.HasFlag(Handlers.Lists)) objectHandlers.Add(new ObjectLookupFields());
if (provisioningInfo.HandlersToProcess.HasFlag(Handlers.Fields) || provisioningInfo.HandlersToProcess.HasFlag(Handlers.Lists)) objectHandlers.Add(new ObjectListInstanceDataRows());
if (provisioningInfo.HandlersToProcess.HasFlag(Handlers.Workflows)) objectHandlers.Add(new ObjectWorkflows());
if (provisioningInfo.HandlersToProcess.HasFlag(Handlers.Files)) objectHandlers.Add(new ObjectFiles());
if (provisioningInfo.HandlersToProcess.HasFlag(Handlers.Pages)) objectHandlers.Add(new ObjectPages());
if (provisioningInfo.HandlersToProcess.HasFlag(Handlers.PageContents)) objectHandlers.Add(new ObjectPageContents());
if (provisioningInfo.HandlersToProcess.HasFlag(Handlers.CustomActions)) objectHandlers.Add(new ObjectCustomActions());
if (provisioningInfo.HandlersToProcess.HasFlag(Handlers.Publishing)) objectHandlers.Add(new ObjectPublishing());
if (provisioningInfo.HandlersToProcess.HasFlag(Handlers.PublishingPages)) objectHandlers.Add(new ObjectPublishingPages());
if (provisioningInfo.HandlersToProcess.HasFlag(Handlers.ComposedLook)) objectHandlers.Add(new ObjectComposedLook());
if (provisioningInfo.HandlersToProcess.HasFlag(Handlers.SearchSettings)) objectHandlers.Add(new ObjectSearchSettings());
if (provisioningInfo.HandlersToProcess.HasFlag(Handlers.PropertyBagEntries)) objectHandlers.Add(new ObjectPropertyBagEntry());
if (provisioningInfo.HandlersToProcess.HasFlag(Handlers.WebSettings)) objectHandlers.Add(new ObjectWebSettings());
if (provisioningInfo.HandlersToProcess.HasFlag(Handlers.Navigation)) objectHandlers.Add(new ObjectNavigation());
objectHandlers.Add(new ObjectLocalization()); // Always add this one, check is done in the handler
if (provisioningInfo.HandlersToProcess.HasFlag(Handlers.ExtensibilityProviders)) objectHandlers.Add(new ObjectExtensibilityHandlers());
// Only persist template information in case this flag is set: this will allow the engine to
// work with lesser permissions
if (provisioningInfo.PersistTemplateInfo)
{
objectHandlers.Add(new ObjectPersistTemplateInfo());
}
var tokenParser = new TokenParser(web, template);
if (provisioningInfo.HandlersToProcess.HasFlag(Handlers.ExtensibilityProviders))
{
var extensibilityHandler = objectHandlers.OfType<ObjectExtensibilityHandlers>().First();
extensibilityHandler.AddExtendedTokens(web, template, tokenParser, provisioningInfo);
}
int step = 1;
//.........这里部分代码省略.........
示例9: ExtractObjects
public override ProvisioningTemplate ExtractObjects(Web web, ProvisioningTemplate template, ProvisioningTemplateCreationInformation creationInfo)
{
if (template.Workflows == null)
{
template.Workflows = new Workflows();
}
using (var scope = new PnPMonitoredScope(this.Name))
{
if (creationInfo.FileConnector == null)
{
scope.LogWarning("Cannot export Workflow definitions without a FileConnector.");
}
else
{
// Pre-load useful properties
web.EnsureProperty(w => w.Id);
// Retrieve all the lists and libraries
var lists = web.Lists;
web.Context.Load(lists);
web.Context.ExecuteQuery();
// Retrieve the workflow definitions (including unpublished ones)
Microsoft.SharePoint.Client.WorkflowServices.WorkflowDefinition[] definitions = null;
try
{
definitions = web.GetWorkflowDefinitions(false);
}
catch (ServerException)
{
// If there is no workflow service present in the farm this method will throw an error.
// Swallow the exception
}
if (definitions != null)
{
template.Workflows.WorkflowDefinitions.AddRange(
from d in definitions
select new Model.WorkflowDefinition(d.Properties.TokenizeWorkflowDefinitionProperties(lists))
{
AssociationUrl = d.AssociationUrl,
Description = d.Description,
DisplayName = d.DisplayName,
DraftVersion = d.DraftVersion,
FormField = d.FormField,
Id = d.Id,
InitiationUrl = d.InitiationUrl,
Published = d.Published,
RequiresAssociationForm = d.RequiresAssociationForm,
RequiresInitiationForm = d.RequiresInitiationForm,
RestrictToScope = (!String.IsNullOrEmpty(d.RestrictToScope) && Guid.Parse(d.RestrictToScope) != web.Id) ? WorkflowExtension.TokenizeListIdProperty(d.RestrictToScope, lists) : null,
RestrictToType = !String.IsNullOrEmpty(d.RestrictToType) ? d.RestrictToType : "Universal",
XamlPath = d.Xaml.SaveXamlToFile(d.Id, creationInfo.FileConnector),
}
);
}
// Retrieve the workflow subscriptions
Microsoft.SharePoint.Client.WorkflowServices.WorkflowSubscription[] subscriptions = null;
try
{
subscriptions = web.GetWorkflowSubscriptions();
}
catch (ServerException)
{
// If there is no workflow service present in the farm this method will throw an error.
// Swallow the exception
}
if (subscriptions != null)
{
#if CLIENTSDKV15
template.Workflows.WorkflowSubscriptions.AddRange(
from s in subscriptions
select new Model.WorkflowSubscription(s.PropertyDefinitions.TokenizeWorkflowSubscriptionProperties(lists))
{
DefinitionId = s.DefinitionId,
Enabled = s.Enabled,
EventSourceId = s.EventSourceId != web.Id ? String.Format("{{listid:{0}}}", lists.First(l => l.Id == s.EventSourceId).Title) : null,
EventTypes = s.EventTypes.ToList(),
ManualStartBypassesActivationLimit = s.ManualStartBypassesActivationLimit,
Name = s.Name,
ListId = s.EventSourceId != web.Id ? String.Format("{{listid:{0}}}", lists.First(l => l.Id == s.EventSourceId).Title) : null,
StatusFieldName = s.StatusFieldName,
}
);
#else
template.Workflows.WorkflowSubscriptions.AddRange(
from s in subscriptions
select new Model.WorkflowSubscription(s.PropertyDefinitions.TokenizeWorkflowSubscriptionProperties(lists))
{
DefinitionId = s.DefinitionId,
Enabled = s.Enabled,
EventSourceId = s.EventSourceId != web.Id ? WorkflowExtension.TokenizeListIdProperty(s.EventSourceId.ToString(), lists) : null,
EventTypes = s.EventTypes.ToList(),
ManualStartBypassesActivationLimit = s.ManualStartBypassesActivationLimit,
Name = s.Name,
//.........这里部分代码省略.........
示例10: ProvisionObjects
public override TokenParser ProvisionObjects(Web web, ProvisioningTemplate template, TokenParser parser, ProvisioningTemplateApplyingInformation applyingInformation)
{
using (var scope = new PnPMonitoredScope(this.Name))
{
if (template.WebSettings != null)
{
var webSettings = template.WebSettings;
#if !CLIENTSDKV15
web.NoCrawl = webSettings.NoCrawl;
web.EnsureProperty(w => w.HasUniqueRoleAssignments);
if (!web.IsSubSite() || (web.IsSubSite() && web.HasUniqueRoleAssignments))
{
String requestAccessEmailValue = parser.ParseString(webSettings.RequestAccessEmail);
if (!String.IsNullOrEmpty(requestAccessEmailValue) && requestAccessEmailValue.Length >= 255)
{
requestAccessEmailValue = requestAccessEmailValue.Substring(0, 255);
}
if (!String.IsNullOrEmpty(requestAccessEmailValue))
{
web.RequestAccessEmail = requestAccessEmailValue;
}
}
#endif
var masterUrl = parser.ParseString(webSettings.MasterPageUrl);
if (!string.IsNullOrEmpty(masterUrl))
{
web.MasterUrl = masterUrl;
}
var customMasterUrl = parser.ParseString(webSettings.CustomMasterPageUrl);
if (!string.IsNullOrEmpty(customMasterUrl))
{
web.CustomMasterUrl = customMasterUrl;
}
web.Description = parser.ParseString(webSettings.Description);
web.SiteLogoUrl = parser.ParseString(webSettings.SiteLogo);
var welcomePage = parser.ParseString(webSettings.WelcomePage);
if (!string.IsNullOrEmpty(welcomePage))
{
web.RootFolder.WelcomePage = welcomePage;
web.RootFolder.Update();
}
web.AlternateCssUrl = parser.ParseString(webSettings.AlternateCSS);
web.Update();
web.Context.ExecuteQueryRetry();
}
}
return parser;
}
示例11: ProvisionObjects
public override TokenParser ProvisionObjects(Web web, ProvisioningTemplate template, TokenParser parser, ProvisioningTemplateApplyingInformation applyingInformation)
{
using (var scope = new PnPMonitoredScope(this.Name))
{
// Get a reference to infrastructural services
WorkflowServicesManager servicesManager = null;
try
{
servicesManager = new WorkflowServicesManager(web.Context, web);
}
catch (ServerException)
{
// If there is no workflow service present in the farm this method will throw an error.
// Swallow the exception
}
if (servicesManager != null)
{
var deploymentService = servicesManager.GetWorkflowDeploymentService();
var subscriptionService = servicesManager.GetWorkflowSubscriptionService();
// Pre-load useful properties
web.EnsureProperty(w => w.Id);
// Provision Workflow Definitions
foreach (var templateDefinition in template.Workflows.WorkflowDefinitions)
{
// Load the Workflow Definition XAML
Stream xamlStream = template.Connector.GetFileStream(templateDefinition.XamlPath);
System.Xml.Linq.XElement xaml = System.Xml.Linq.XElement.Load(xamlStream);
int retryCount = 5;
int retryAttempts = 1;
int delay = 2000;
while (retryAttempts <= retryCount)
{
try
{
// Create the WorkflowDefinition instance
Microsoft.SharePoint.Client.WorkflowServices.WorkflowDefinition workflowDefinition =
new Microsoft.SharePoint.Client.WorkflowServices.WorkflowDefinition(web.Context)
{
AssociationUrl = templateDefinition.AssociationUrl,
Description = templateDefinition.Description,
DisplayName = templateDefinition.DisplayName,
FormField = templateDefinition.FormField,
DraftVersion = templateDefinition.DraftVersion,
Id = templateDefinition.Id,
InitiationUrl = templateDefinition.InitiationUrl,
RequiresAssociationForm = templateDefinition.RequiresAssociationForm,
RequiresInitiationForm = templateDefinition.RequiresInitiationForm,
RestrictToScope = parser.ParseString(templateDefinition.RestrictToScope),
RestrictToType = templateDefinition.RestrictToType != "Universal" ? templateDefinition.RestrictToType : null,
Xaml = parser.ParseString(xaml.ToString()),
};
//foreach (var p in definition.Properties)
//{
// workflowDefinition.SetProperty(p.Key, parser.ParseString(p.Value));
//}
// Save the Workflow Definition
var newDefinition = deploymentService.SaveDefinition(workflowDefinition);
//web.Context.Load(workflowDefinition); //not needed
web.Context.ExecuteQueryRetry();
// Let's publish the Workflow Definition, if needed
if (templateDefinition.Published)
{
deploymentService.PublishDefinition(newDefinition.Value);
web.Context.ExecuteQueryRetry();
}
break; // no errors so exit loop
}
catch (Exception ex)
{
// check exception is due to connection closed issue
if (ex is ServerException && ((ServerException)ex).ServerErrorCode == -2130575223 &&
((ServerException)ex).ServerErrorTypeName.Equals("Microsoft.SharePoint.SPException", StringComparison.InvariantCultureIgnoreCase) &&
((ServerException)ex).Message.Contains("A connection that was expected to be kept alive was closed by the server.")
)
{
WriteWarning(String.Format("Connection closed whilst adding Workflow Definition, trying again in {0}ms", delay), ProvisioningMessageType.Warning);
Thread.Sleep(delay);
retryAttempts++;
delay = delay * 2; // double delay for next retry
}
else
{
throw;
}
}
}
}
//.........这里部分代码省略.........
示例12: ExtractObjects
public override ProvisioningTemplate ExtractObjects(Web web, ProvisioningTemplate template, ProvisioningTemplateCreationInformation creationInfo)
{
using (var scope = new PnPMonitoredScope(this.Name))
{
scope.LogInfo(CoreResources.Provisioning_ObjectHandlers_ComposedLooks_ExtractObjects_Retrieving_current_composed_look);
// Ensure that we have URL property loaded for web and site
web.EnsureProperty(w => w.Url);
Site site = (web.Context as ClientContext).Site;
site.EnsureProperty(s => s.Url);
SharePointConnector spConnector = new SharePointConnector(web.Context, web.Url, "dummy");
// to get files from theme catalog we need a connector linked to the root site
SharePointConnector spConnectorRoot;
if (!site.Url.Equals(web.Url, StringComparison.InvariantCultureIgnoreCase))
{
spConnectorRoot = new SharePointConnector(web.Context.Clone(site.Url), site.Url, "dummy");
}
else
{
spConnectorRoot = spConnector;
}
// Check if we have composed look info in the property bag, if so, use that, otherwise try to detect the current composed look
if (web.PropertyBagContainsKey("_PnP_ProvisioningTemplateComposedLookInfo"))
{
scope.LogInfo(CoreResources.Provisioning_ObjectHandlers_ComposedLooks_ExtractObjects_Using_ComposedLookInfoFromPropertyBag);
try
{
var composedLook = JsonConvert.DeserializeObject<ComposedLook>(web.GetPropertyBagValueString("_PnP_ProvisioningTemplateComposedLookInfo", ""));
if (composedLook.Name == null || composedLook.BackgroundFile == null || composedLook.FontFile == null)
{
scope.LogError(CoreResources.Provisioning_ObjectHandlers_ComposedLooks_ExtractObjects_ComposedLookInfoFailedToDeserialize);
throw new JsonSerializationException();
}
composedLook.BackgroundFile = Tokenize(composedLook.BackgroundFile, web.Url);
composedLook.FontFile = Tokenize(composedLook.FontFile, web.Url);
composedLook.ColorFile = Tokenize(composedLook.ColorFile, web.Url);
template.ComposedLook = composedLook;
if (!web.IsSubSite() && creationInfo != null &&
creationInfo.PersistBrandingFiles && creationInfo.FileConnector != null)
{
scope.LogDebug(CoreResources.Provisioning_ObjectHandlers_ComposedLooks_ExtractObjects_Creating_SharePointConnector);
// Let's create a SharePoint connector since our files anyhow are in SharePoint at this moment
TokenParser parser = new TokenParser(web, template);
DownLoadFile(spConnector, spConnectorRoot, creationInfo.FileConnector, web.Url, parser.ParseString(composedLook.BackgroundFile), scope);
DownLoadFile(spConnector, spConnectorRoot, creationInfo.FileConnector, web.Url, parser.ParseString(composedLook.ColorFile), scope);
DownLoadFile(spConnector, spConnectorRoot, creationInfo.FileConnector, web.Url, parser.ParseString(composedLook.FontFile), scope);
}
// Create file entries for the custom theme files
if (!string.IsNullOrEmpty(template.ComposedLook.BackgroundFile))
{
var f = GetComposedLookFile(template.ComposedLook.BackgroundFile);
f.Folder = Tokenize(f.Folder, web.Url);
template.Files.Add(f);
}
if (!string.IsNullOrEmpty(template.ComposedLook.ColorFile))
{
var f = GetComposedLookFile(template.ComposedLook.ColorFile);
f.Folder = Tokenize(f.Folder, web.Url);
template.Files.Add(f);
}
if (!string.IsNullOrEmpty(template.ComposedLook.FontFile))
{
var f = GetComposedLookFile(template.ComposedLook.FontFile);
f.Folder = Tokenize(f.Folder, web.Url);
template.Files.Add(f);
}
}
catch (JsonSerializationException)
{
// cannot deserialize the object, fall back to composed look detection
template = DetectComposedLook(web, template, creationInfo, scope, spConnector, spConnectorRoot);
}
}
else
{
template = DetectComposedLook(web, template, creationInfo, scope, spConnector, spConnectorRoot);
}
if (creationInfo != null && creationInfo.BaseTemplate != null)
{
template = CleanupEntities(template, creationInfo.BaseTemplate);
}
}
return template;
}
示例13: GetTemplateFile
//TODO: Candidate for cleanup
private Model.File GetTemplateFile(Web web, string serverRelativeUrl, FileConnectorBase connector, TokenParser parser)
{
var webServerUrl = web.EnsureProperty(w => w.Url);
var serverUri = new Uri(webServerUrl);
var serverUrl = string.Format("{0}://{1}", serverUri.Scheme, serverUri.Authority);
var fullUri = new Uri(UrlUtility.Combine(serverUrl, serverRelativeUrl));
var folderPath = fullUri.Segments.Take(fullUri.Segments.Count() - 1).ToArray().Aggregate((i, x) => i + x).TrimEnd('/');
var fileName = fullUri.Segments[fullUri.Segments.Count() - 1];
var templateFile = new Model.File()
{
Folder = TokenizeUrl(folderPath, parser),
Src = (null != connector) ? Path.Combine(connector.GetConnectionString(), fileName) : fileName,
Overwrite = true,
};
return templateFile;
}
示例14: ProvisionObjects
public override TokenParser ProvisionObjects(Web web, ProvisioningTemplate template, TokenParser parser, ProvisioningTemplateApplyingInformation applyingInformation)
{
using (var scope = new PnPMonitoredScope(this.Name))
{
if (template.WebSettings != null)
{
// Check if this is not a noscript site as we're not allowed to update some properties
bool isNoScriptSite = web.IsNoScriptSite();
web.EnsureProperty(w => w.HasUniqueRoleAssignments);
var webSettings = template.WebSettings;
#if !ONPREMISES
if (!isNoScriptSite)
{
web.NoCrawl = webSettings.NoCrawl;
}
else
{
scope.LogWarning(CoreResources.Provisioning_ObjectHandlers_WebSettings_SkipNoCrawlUpdate);
}
if (!web.IsSubSite() || (web.IsSubSite() && web.HasUniqueRoleAssignments))
{
String requestAccessEmailValue = parser.ParseString(webSettings.RequestAccessEmail);
if (!String.IsNullOrEmpty(requestAccessEmailValue) && requestAccessEmailValue.Length >= 255)
{
requestAccessEmailValue = requestAccessEmailValue.Substring(0, 255);
}
if (!String.IsNullOrEmpty(requestAccessEmailValue))
{
web.RequestAccessEmail = requestAccessEmailValue;
web.Update();
web.Context.ExecuteQueryRetry();
}
}
#endif
var masterUrl = parser.ParseString(webSettings.MasterPageUrl);
if (!string.IsNullOrEmpty(masterUrl))
{
if (!isNoScriptSite)
{
web.MasterUrl = masterUrl;
}
else
{
scope.LogWarning(CoreResources.Provisioning_ObjectHandlers_WebSettings_SkipMasterPageUpdate);
}
}
var customMasterUrl = parser.ParseString(webSettings.CustomMasterPageUrl);
if (!string.IsNullOrEmpty(customMasterUrl))
{
if (!isNoScriptSite)
{
web.CustomMasterUrl = customMasterUrl;
}
else
{
scope.LogWarning(CoreResources.Provisioning_ObjectHandlers_WebSettings_SkipCustomMasterPageUpdate);
}
}
if (webSettings.Title != null)
{
web.Title = parser.ParseString(webSettings.Title);
}
if (webSettings.Description != null)
{
web.Description = parser.ParseString(webSettings.Description);
}
if (webSettings.SiteLogo != null)
{
web.SiteLogoUrl = parser.ParseString(webSettings.SiteLogo);
}
var welcomePage = parser.ParseString(webSettings.WelcomePage);
if (!string.IsNullOrEmpty(welcomePage))
{
web.RootFolder.WelcomePage = welcomePage;
web.RootFolder.Update();
}
if (webSettings.AlternateCSS != null)
{
web.AlternateCssUrl = parser.ParseString(webSettings.AlternateCSS);
}
web.Update();
web.Context.ExecuteQueryRetry();
}
}
return parser;
}
示例15: ExtractMasterPagesAndPageLayouts
private void ExtractMasterPagesAndPageLayouts(Web web, ProvisioningTemplate template, PnPMonitoredScope scope, ProvisioningTemplateCreationInformation creationInfo)
{
web.EnsureProperty(w => w.Url);
String webApplicationUrl = GetWebApplicationUrl(web.Url);
if (!String.IsNullOrEmpty(webApplicationUrl))
{
// Get the Publishing Feature reference template
ProvisioningTemplate publishingFeatureTemplate = GetPublishingFeatureBaseTemplate();
// Get a reference to the root folder of the master page gallery
var gallery = web.GetCatalog(116);
web.Context.Load(gallery, g => g.RootFolder);
web.Context.ExecuteQueryRetry();
var masterPageGalleryFolder = gallery.RootFolder;
// Load the files in the master page gallery
web.Context.Load(masterPageGalleryFolder.Files);
web.Context.ExecuteQueryRetry();
var sourceFiles = masterPageGalleryFolder.Files.AsEnumerable().Where(
f => f.Name.EndsWith(".aspx", StringComparison.InvariantCultureIgnoreCase) ||
f.Name.EndsWith(".html", StringComparison.InvariantCultureIgnoreCase) ||
f.Name.EndsWith(".master", StringComparison.InvariantCultureIgnoreCase));
foreach (var file in sourceFiles)
{
var listItem = file.EnsureProperty(f => f.ListItemAllFields);
listItem.ContentType.EnsureProperties(ct => ct.Id, ct => ct.StringId);
// Check if the content type is of type Master Page or Page Layout
if (listItem.ContentType.StringId.StartsWith(MASTER_PAGE_CONTENT_TYPE_ID) ||
listItem.ContentType.StringId.StartsWith(PAGE_LAYOUT_CONTENT_TYPE_ID) ||
listItem.ContentType.StringId.StartsWith(HTML_MASTER_PAGE_CONTENT_TYPE_ID) ||
listItem.ContentType.StringId.StartsWith(HTML_PAGE_LAYOUT_CONTENT_TYPE_ID))
{
// Skip any .ASPX or .MASTER file related to an .HTML designer file
if ((file.Name.EndsWith(".aspx", StringComparison.InvariantCultureIgnoreCase)
&& sourceFiles.Any(f => f.Name.Equals(file.Name.ToLower().Replace(".aspx", ".html"),
StringComparison.InvariantCultureIgnoreCase))) ||
(file.Name.EndsWith(".master", StringComparison.InvariantCultureIgnoreCase)
&& sourceFiles.Any(f => f.Name.Equals(file.Name.ToLower().Replace(".master", ".html"),
StringComparison.InvariantCultureIgnoreCase))))
{
continue;
}
// If the file is a custom one, and not one native
// and coming out from the publishing feature
if (creationInfo.IncludeNativePublishingFiles ||
!IsPublishingFeatureNativeFile(publishingFeatureTemplate, file.Name))
{
var fullUri = new Uri(UrlUtility.Combine(webApplicationUrl, file.ServerRelativeUrl));
var folderPath = fullUri.Segments.Take(fullUri.Segments.Count() - 1).ToArray().Aggregate((i, x) => i + x).TrimEnd('/');
var fileName = fullUri.Segments[fullUri.Segments.Count() - 1];
var publishingFile = new Model.File()
{
Folder = Tokenize(folderPath, web.Url),
Src = HttpUtility.UrlDecode(fileName),
Overwrite = true,
};
// Add field values to file
RetrieveFieldValues(web, file, publishingFile);
// Add the file to the template
template.Files.Add(publishingFile);
// Persist file using connector, if needed
if (creationInfo.PersistPublishingFiles)
{
PersistFile(web, creationInfo, scope, folderPath, fileName, true);
}
if (listItem.ContentType.StringId.StartsWith(MASTER_PAGE_CONTENT_TYPE_ID))
{
scope.LogWarning(String.Format("The file \"{0}\" is a custom MasterPage. Accordingly to the PnP Guidance (http://aka.ms/o365pnpguidancemasterpages) you should try to avoid using custom MasterPages.", file.Name));
}
}
else
{
scope.LogWarning(String.Format("Skipping file \"{0}\" because it is native in the publishing feature.", file.Name));
}
}
}
}
}