How to upload and activate sandbox solutions using CSOM
I was working with one my friends, Suman (shoe) Chakrabarti on a Patterns & Practice solution that prevents deletion of sites using partial code (Sandbox). Well he wrote the code for that, but we decided to add an extra bonus item. We thought it would be nice to show how to add the solution to the gallery and active the solution in the sample.
Solution Deployment/Removal
In order to upload the wsp to the Solution Gallery, we are going to use the FileCreationInformation class to upload the file to the gallery. Removing the solution is handled by finding the uploaded file and calling the DeleteObject member.
// get the file from the server path in the provider site
var filePath = Server.MapPath("~/PreventDeleteSites.wsp");
var file = new FileStream(filePath, FileMode.Open);
// create the FileCreationInformation object and prepare
// to upload it to the solution gallery
var fileCI = new FileCreationInformation() {
ContentStream = file,
Url = "PreventDeleteSites.wsp",
Overwrite = true
};
// upload the solution to the gallery
var uploadedFile = solutionGallery.RootFolder.Files.Add(fileCI);
clientContext.Load(uploadedFile);
clientContext.ExecuteQuery();
Solution Activation/Deactivation
Solution activation is done using the DesignPackage class in the Microsoft.SharePoint.Client.Publishing assembly. We are going to use the DesignPackage.Install and DesignPackage.Uninstall members to activate and deactivate the solution for the site collection.
// get the DesignPackageInfo (which is the same name for a sandbox solution)
var wsp = new DesignPackageInfo(){
// during deployment, the solution ID is not necessary but we need the Guid during removal
PackageGuid = Guid.Empty, // 4c16c0b9-0162-43ad-a8e9-a4b810e58a56
PackageName = "PreventDeleteSites"
};
// install the solution from the file url
var filerelativeurl = solutionGallery.RootFolder.ServerRelativeUrl + "/PreventDeleteSites.wsp";
DesignPackage.Install(clientContext, clientContext.Site, wsp, filerelativeurl);
clientContext.ExecuteQuery();
References
The Prevent Site Deletion sample that shows this code in action
Office 365 Patterns and Practices
Microsoft.SharePoint.Client.Publishing
Comments
Anonymous
August 10, 2014
Does the DesignPackage.Install method handle solution upgrades too -- or is this just for first-time activations?Anonymous
August 11, 2014
Just first-time activationsAnonymous
August 13, 2014
Thanks for this. Is there any code for retrieving solutiongallery as it is in your example already referenced?Anonymous
August 13, 2014
Its in the example that I referenced var solutionGallery = clientContext.Web.Lists.GetByTitle("Solution Gallery"); clientContext.Load(solutionGallery); clientContext.ExecuteQuery(); // get the file from the server path in the provider site var filePath = Server.MapPath("~/PreventDeleteSites.wsp"); var file = new FileStream(filePath, FileMode.Open);Anonymous
September 22, 2014
The comment has been removed