Softlanding: SharePoint Consulting & Managed Services | Vancouver, BC

    Enhancing Enterprise Productivity Since 2000

    Softlanding helps organizations be their best by providing technology solutions and services that make them more productive. Softlanding specializes in Microsoft enterprise technology platforms, leveraging a combination of cloud, on-premises and hybrid configurations to increase productivity from the data center on out to end business users. Platform specialties include SharePoint, Azure, Office 365, Power BI, Enterprise Mobility Suite and System Center.


     SharePointROI Sustainment Services

                                                           SharePointROI is a, fixed- fee managed service providing end-to-end SharePoint sustainment, user support and adoption services. Eliminate SharePoint expertise hiring headaches and get the most out of your SharePoint investment.​

    Learn More >>

     Current Openings

    Looking for a career? We're on the lookout for fun, talented people to join our growing teams. If you're looking to progess your career, apply here:

    Openings >>



    Takes Place:
    Description: Celebrate the year with us at our Open House event Thursday, October 27th from 4:30 to 7pm at the Softlanding office.

     Featured Solutions

    Connecting Talent and Resources for Better Performance

    Corix finds a scalable solution to communication issues and improves organizational performance in the process. Read more here


     Hidden Title

    Strategic IT to Support Organizational Change

    The BC First Nations Health Authority finds a strategic partner for a major transition, plus continued IT support for successful delivery of essential services. Read more here​. 



    Posted on:
    Categories: Azure
    ​When working with multiple developers on a project there’s always the potential of stepping on each other’s toes unintentionally. When a configuration setting is changed, or maybe a package for the project is updated it could cause havoc for the other developers without anyone knowing what caused the issues.Think of Source Control Internally we use Team Foundation Server (TFS) for our source control with our projects. When developing web applications using Visual Studio and ASP.Net you can use NuGet to grab packages for your projects. This is very useful as it enables easier management for adding in references and components required for your solutions. Such as adding in the SharePointOnline CSOM or jQuery. The issue that can arise from using NuGet and TFS, is that by default TFS will add all the files to source control. This can become a headache especially if developers are updating the NuGet packages at different times which can cause issues checking in changes as well as compiling your solutions. To get TFS to ignore NuGet packages Add a file named .tfignore to the solution folder with the following content (This will tell TFS to ignore all the NuGet package files) \packages Now create a folder under the solution folder named .nuget In the .nuget folder create a text file named NuGet.config and add the following content <?xml version="1.0" encoding="utf-8"?> <configuration> <solution> <add key="disableSourceControlIntegration" value="true" /> </solution> </configuration> Now once you add your solution to TFS you won't have the future headaches related to NuGet packages!Multiple Web Configs and Build Configs By default, a web application project already has a couple build configurations set up with their own web configuration transforms created (Web.Debug.config and Web.Release.config). As we were building a SharePoint provider hosted Add-in with Azure hosting the web application there was a number of configuration settings required that were unique for each developer. To simplify this a new build configuration was created for each developer for use during the development of the web application. To go along with these build configurations a new web configuration transform was added to the solution for each developer (e.g. Web.Dev1.config). This enabled us to have all our unique settings configured separately, as well, these web configuration transforms could be excluded from checking in to TFS to ensure security of all our own Azure applications. For example, the following web configuration transform enabled me to target my own Azure Redis cache, as well, store the client secrets for my SharePoint Add-in separately from the other developers.<?xml version="1.0" encoding="utf-8"?> <configuration xmlnsxdt="http//"> <!-- My App settings --> <appSettings> <add key="ClientId" value="GUID" xdtTransform="SetAttributes" xdtLocator="Match(key)"/> <add key="ClientSecret" value="Shared Secret" xdtTransform="SetAttributes" xdtLocator="Match(key)" /> <add key="ClientValidationEnabled" value="true" /> <add key="UnobtrusiveJavaScriptEnabled" value="true" /> </appSettings> <system.web> <customErrors mode="Off" xdtTransform="Insert" /> <sessionState mode="Custom" customProvider="RedisSessionProvider" xdtTransform="Replace"> <providers> <add name="RedisSessionProvider" type="Microsoft.Web.Redis.RedisSessionStateProvider" host="my" port="6380" accessKey="my key" ssl="true" xdtTransform="Replace" /> </providers> </sessionState> </system.web> </configuration> A good walkthrough on how to set up build configurations can be found here https// Publishing Profiles Last but not least was managing the publishing of our web application to our personal Azure App Services. By accessing the Azure portal and navigating to the App Service that is hosting the developing web application you can download the publishing profile directly from the …More menu in the Overview tab. In Visual Studio, when you go to publish an Azure web application, you get prompted with a Publish Web dialog that allows you to import a new publishing profile. If you Right click your solution and select Publish you will get the Publish Web dialog Select Profile on the left of the dialog Now you can select Import under the Select a publish target menu Just browse and select your publishing profile file and click OK You will now be able to select that profile for publishing your web application to the target app service To further ensure security, the publishing profiles for each developer can be excluded from TFS. These files are located under the ProjectFolder\Properties\PublishProfiles.Final Thoughts By setting up the Visual Studio Solution and Azure Web Application project as described, we eliminated a lot of the headaches that can happen collaborating with multiple developers. This enabled each developer to just select their own Build Profile and then publish their web application with their own Publishing Profile easily.

    Posted on:
    Categories: Office 365;SharePoint
    ​I’m currently working on a provider hosted SharePoint Add-in for a client and I ran into an issue creating list item attachments through our custom code. This issue was related to attaching large files as attachments to the list item via CSOM. The issue I encountered was that if it was a large file I needed to attach I needed to have the attachments folder already created before I could upload the large files. I created something similar to the large file upload solution that is posted in the Office Dev Patterns and Practices samples (https// This enables you to add files larger than 2 MB in pieces (Option 3). Using this method requires that the attachments folder for the list item already exists, if not it will fail and throw an error. After trying a few ways of creating a folder for the list item, such as getting the list and trying to add a folder directly via CSOM which throws an error. I did some research and found some workarounds using the lists.asmx web service to create the folders. Since the older web services are going to be phased out in favour of the newer REST services I decided that wasn’t the best option for a long term solution. Since the issue was only related to adding large files, I decided that adding a small temporary file as an attachment first. This would then create the folder for me, and then I could delete the temporary file and move onto uploading my large attachment.//get the list item and the list's root folder with subfolders var list = clientContext.Web.Lists.GetByTitle(listName); var item = list.GetItemById(listItemId); clientContext.Load(item); clientContext.Load(list.RootFolder.Folders); clientContext.ExecuteQuery(); //get the attachments folder for the list var rootFolder = Enumerable.FirstOrDefault(list.RootFolder.Folders, folder => folder.Name == "Attachments"); clientContext.Load(rootFolder, rf => rf.Folders); clientContext.ExecuteQuery(); var attachmentFolder = Enumerable.FirstOrDefault(rootFolder.Folders, folder => folder.Name == listItemId.ToString()); // if the list item doesn't have an subfolder under the attachments folder, then add a temp file to create the folder if (attachmentFolder == null) //create dummy attachment to force creation of the attachment folder for the list item //note this is needed due to limitations in CSOM and creating folders using ( var dummyFileStream = new FileStream(HostingEnvironment.MapPath(“path to dummy file”), FileMode.Open)) var fileInfo = new AttachmentCreationInformation ContentStream = dummyFileStream, FileName = "tempfile.txt" ; var tempUploadFile = item.AttachmentFiles.Add(fileInfo); clientContext.Load(tempUploadFile); clientContext.ExecuteQuery(); //delete temp file tempUploadFile.DeleteObject(); clientContext.ExecuteQuery(); At this point the folder for the item’s attachments is now created, and I can proceed to upload the large attachment.