/// <summary> /// Activates or deactivates a site collection or site scoped feature /// </summary> /// <param name="web">Web to be processed - can be root web or sub web</param> /// <param name="featureID">ID of the feature to activate/deactivate</param> /// <param name="activate">True to activate, false to deactivate the feature</param> private static void ProcessFeature(this Web web, Guid featureID, bool activate) { FeatureCollection clientSiteFeatures = web.Features; web.Context.Load(clientSiteFeatures); web.Context.ExecuteQuery(); // The original number of active features...use this to track if the feature activation went OK int oldCount = clientSiteFeatures.Count(); if (activate) { // GetById does not seem to work for site scoped features...if (clientSiteFeatures.GetById(featureID) == null) // FeatureDefinitionScope defines how the features have been deployed. All OOB features are farm deployed clientSiteFeatures.Add(featureID, true, FeatureDefinitionScope.Farm); web.Context.ExecuteQuery(); // retry logic needed to make this more bulletproof :-( web.Context.Load(clientSiteFeatures); web.Context.ExecuteQuery(); int tries = 0; int currentCount = clientSiteFeatures.Count(); while (currentCount <= oldCount && tries < 5) { tries++; clientSiteFeatures.Add(featureID, true, FeatureDefinitionScope.Farm); web.Context.ExecuteQuery(); web.Context.Load(clientSiteFeatures); web.Context.ExecuteQuery(); currentCount = clientSiteFeatures.Count(); } } else { try { clientSiteFeatures.Remove(featureID, false); web.Context.ExecuteQuery(); } catch (Exception ex) { LoggingUtility.LogError(string.Format(MSG_PROBLEM_REMOVING, featureID), ex, EventCategory.Features); } } }
/// <summary> /// Activates or deactivates a site collection or site scoped feature /// </summary> /// <param name="site">Site to be processed</param> /// <param name="featureID">ID of the feature to activate/deactivate</param> /// <param name="activate">True to activate, false to deactivate the feature</param> public static void ProcessFeature(this Site site, Guid featureID, bool activate) { FeatureCollection clientSiteFeatures = site.Features; site.Context.Load(clientSiteFeatures); site.Context.ExecuteQuery(); // The original number of active features...use this to track if the feature activation went OK int oldCount = clientSiteFeatures.Count(); if (activate) { // GetById does not seem to work for site scoped features...if (clientSiteFeatures.GetById(featureID) == null) // FeatureDefinitionScope defines how the features have been deployed. All OOB features are farm deployed clientSiteFeatures.Add(featureID, true, FeatureDefinitionScope.Farm); site.Context.ExecuteQuery(); // retry logic needed to make this more bulletproof :-( site.Context.Load(clientSiteFeatures); site.Context.ExecuteQuery(); int tries = 0; int currentCount = clientSiteFeatures.Count(); while (currentCount <= oldCount && tries < 5) { tries++; clientSiteFeatures.Add(featureID, true, FeatureDefinitionScope.Farm); site.Context.ExecuteQuery(); site.Context.Load(clientSiteFeatures); site.Context.ExecuteQuery(); currentCount = clientSiteFeatures.Count(); } } else { try { clientSiteFeatures.Remove(featureID, false); site.Context.ExecuteQuery(); } catch (Exception ex) { throw; } } }
/// <summary> /// Activates or deactivates a site collection or web scoped feature /// </summary> /// <param name="features">Feature Collection which contains the feature</param> /// <param name="featureID">ID of the feature to activate/deactivate</param> /// <param name="activate">True to activate, false to deactivate the feature</param> private static void ProcessFeatureInternal(FeatureCollection features, Guid featureID, bool activate) { features.Context.Load(features); features.Context.ExecuteQueryRetry(); // The original number of active features...use this to track if the feature activation went OK int oldCount = features.Count(); if (activate) { // GetById does not seem to work for site scoped features...if (clientSiteFeatures.GetById(featureID) == null) // FeatureDefinitionScope defines how the features have been deployed. All OOB features are farm deployed features.Add(featureID, true, FeatureDefinitionScope.Farm); features.Context.ExecuteQueryRetry(); // retry logic needed to make this more bulletproof :-( features.Context.Load(features); features.Context.ExecuteQueryRetry(); int tries = 0; int currentCount = features.Count(); while (currentCount <= oldCount && tries < 5) { tries++; features.Add(featureID, true, FeatureDefinitionScope.Farm); features.Context.ExecuteQueryRetry(); features.Context.Load(features); features.Context.ExecuteQueryRetry(); currentCount = features.Count(); } } else { try { features.Remove(featureID, false); features.Context.ExecuteQueryRetry(); } catch (Exception ex) { Log.Error(Constants.LOGGING_SOURCE, CoreResources.FeatureExtensions_FeatureActivationProblem, featureID, ex.Message); } } }
public void UpdateFeatures_ClearsCachedFeatures() { var features = new FeatureCollection(); features.Set <IHttpRequestFeature>(new HttpRequestFeature()); features.Set <IHttpResponseFeature>(new HttpResponseFeature()); features.Set <IHttpResponseBodyFeature>(new StreamResponseBodyFeature(Stream.Null)); features.Set <IHttpWebSocketFeature>(new TestHttpWebSocketFeature()); // FeatureCollection is set. all cached interfaces are null. var context = new DefaultHttpContext(features); TestAllCachedFeaturesAreNull(context, features); Assert.Equal(4, features.Count()); // getting feature properties populates feature collection with defaults TestAllCachedFeaturesAreSet(context, features); Assert.NotEqual(4, features.Count()); // FeatureCollection is null. and all cached interfaces are null. // only top level is tested because child objects are inaccessible. context.Uninitialize(); TestCachedFeaturesAreNull(context, null); var newFeatures = new FeatureCollection(); newFeatures.Set <IHttpRequestFeature>(new HttpRequestFeature()); newFeatures.Set <IHttpResponseFeature>(new HttpResponseFeature()); newFeatures.Set <IHttpResponseBodyFeature>(new StreamResponseBodyFeature(Stream.Null)); newFeatures.Set <IHttpWebSocketFeature>(new TestHttpWebSocketFeature()); // FeatureCollection is set to newFeatures. all cached interfaces are null. context.Initialize(newFeatures); TestAllCachedFeaturesAreNull(context, newFeatures); Assert.Equal(4, newFeatures.Count()); // getting feature properties populates new feature collection with defaults TestAllCachedFeaturesAreSet(context, newFeatures); Assert.NotEqual(4, newFeatures.Count()); }
/// <summary> /// Activates or deactivates a site collection or web scoped feature /// </summary> /// <param name="features">Feature Collection which contains the feature</param> /// <param name="featureID">ID of the feature to activate/deactivate</param> /// <param name="activate">True to activate, false to deactivate the feature</param> /// <param name="scope">Scope of the feature definition</param> private static void ProcessFeatureInternal(FeatureCollection features, Guid featureID, bool activate, FeatureDefinitionScope scope) { features.Context.Load(features); features.Context.ExecuteQueryRetry(); // The original number of active features...use this to track if the feature activation went OK int oldCount = features.Count(); if (activate) { // GetById does not seem to work for site scoped features...if (clientSiteFeatures.GetById(featureID) == null) // FeatureDefinitionScope defines how the features have been deployed. All OOB features are farm deployed features.Add(featureID, true, scope); features.Context.ExecuteQueryRetry(); // retry logic needed to make this more bulletproof :-( features.Context.Load(features); features.Context.ExecuteQueryRetry(); int tries = 0; int currentCount = features.Count(); while (currentCount <= oldCount && tries < 5) { tries++; features.Add(featureID, true, scope); features.Context.ExecuteQueryRetry(); features.Context.Load(features); features.Context.ExecuteQueryRetry(); currentCount = features.Count(); } } else { try { features.Remove(featureID, false); features.Context.ExecuteQueryRetry(); } catch (Exception ex) { Log.Error(Constants.LOGGING_SOURCE, CoreResources.FeatureExtensions_FeatureActivationProblem, featureID, ex.Message); } } }
public void UpdateFeatures_ClearsCachedFeatures() { var features = new FeatureCollection(); features.Set<IHttpRequestFeature>(new HttpRequestFeature()); features.Set<IHttpResponseFeature>(new HttpResponseFeature()); features.Set<IHttpWebSocketFeature>(new TestHttpWebSocketFeature()); // featurecollection is set. all cached interfaces are null. var context = new DefaultHttpContext(features); TestAllCachedFeaturesAreNull(context, features); Assert.Equal(3, features.Count()); // getting feature properties populates feature collection with defaults TestAllCachedFeaturesAreSet(context, features); Assert.NotEqual(3, features.Count()); // featurecollection is null. and all cached interfaces are null. // only top level is tested because child objects are inaccessible. context.Uninitialize(); TestCachedFeaturesAreNull(context, null); var newFeatures = new FeatureCollection(); newFeatures.Set<IHttpRequestFeature>(new HttpRequestFeature()); newFeatures.Set<IHttpResponseFeature>(new HttpResponseFeature()); newFeatures.Set<IHttpWebSocketFeature>(new TestHttpWebSocketFeature()); // featurecollection is set to newFeatures. all cached interfaces are null. context.Initialize(newFeatures); TestAllCachedFeaturesAreNull(context, newFeatures); Assert.Equal(3, newFeatures.Count()); // getting feature properties populates new feature collection with defaults TestAllCachedFeaturesAreSet(context, newFeatures); Assert.NotEqual(3, newFeatures.Count()); }