Click here to Skip to main content
15,947,785 members

Dominic Burford - Professional Profile


Follow on Twitter LinkedIn      Blog RSS
I am a professional software engineer and technical architect with over twenty years commercial development experience with a strong focus on the design and development of web and mobile applications.

I have experience of architecting scalable, distributed, high volume web applications that are accessible from multiple devices due to their responsive web design, including architecting enterprise service-oriented solutions. I have also developed enterprise mobile applications using Xamarin and Telerik Platform.

I have extensive experience using .NET, ASP.NET, Windows and Web Services, WCF, SQL Server, LINQ and other Microsoft technologies. I am also familiar with HTML, Bootstrap, Javascript (inc. JQuery and Node.js), CSS, XML, JSON, Apache Cordova, KendoUI and many other web and mobile related technologies.

I am enthusiastic about Continuous Integration, Continuous Delivery and Application Life-cycle Management having configured such environments using CruiseControl.NET, TeamCity and Team Foundation Services. I enjoy working in Agile and Test Driven Development (TDD) environments.

Outside of work I have two beautiful daughters. I am also an avid cyclist who enjoys reading, listening to music and travelling.



Weekly Data. Recent events may not appear immediately. For information on Reputation please see the FAQ.


Members need to achieve at least one of the given member levels in the given reputation categories in order to perform a given action. For example, to store personal files in your account area you will need to achieve Platinum level in either the Author or Authority category. The "If Owner" column means that owners of an item automatically have the privilege. The member types column lists member types who gain the privilege regardless of their reputation level.

ActionAuthorAuthorityDebatorEditorEnquirerOrganiserParticipantIf OwnerMember Types
Have no restrictions on voting frequencysilversilversilversilver
Bypass spam checks when posting contentsilversilversilversilversilversilvergoldSubEditor, Mentor, Protector, Editor
Store personal files in your account areaplatinumplatinumSubEditor, Editor
Have live hyperlinks in your profilebronzebronzebronzebronzebronzebronzesilverSubEditor, Protector, Editor
Have the ability to include a biography in your profilebronzebronzebronzebronzebronzebronzesilverSubEditor, Protector, Editor
Edit a Question in Q&AsilversilversilversilverYesSubEditor, Protector, Editor
Edit an Answer in Q&AsilversilversilversilverYesSubEditor, Protector, Editor
Delete a Question in Q&AYesSubEditor, Protector, Editor
Delete an Answer in Q&AYesSubEditor, Protector, Editor
Report an ArticlesilversilversilversilverSubEditor, Mentor, Protector, Editor
Approve/Disapprove a pending ArticlegoldgoldgoldgoldSubEditor, Mentor, Protector, Editor
Edit other members' articlesSubEditor, Protector, Editor
Create an article without requiring moderationplatinumSubEditor, Mentor, Protector, Editor
Approve/Disapprove a pending QuestionProtector
Approve/Disapprove a pending AnswerProtector
Report a forum messagesilversilverbronzeProtector, Editor
Approve/Disapprove a pending Forum MessageProtector
Have the ability to send direct emails to members in the forumsProtector
Create a new tagsilversilversilversilver
Modify a tagsilversilversilversilver

Actions with a green tick can be performed by this member.

GeneralBlog updates Pin
Dominic Burford13-May-21 1:37
professionalDominic Burford13-May-21 1:37 
GeneralPublishing events into an ASP.NET Core webhook with Octopus Pin
Dominic Burford13-May-21 1:33
professionalDominic Burford13-May-21 1:33 
GeneralA quick update Pin
Dominic Burford2-Nov-20 8:33
professionalDominic Burford2-Nov-20 8:33 
GeneralHow do you know when it's time to move on? Pin
Dominic Burford19-Aug-20 0:19
professionalDominic Burford19-Aug-20 0:19 
GeneralInitial thoughts on deploying with Octopus Pin
Dominic Burford17-Aug-20 4:25
professionalDominic Burford17-Aug-20 4:25 
GeneralWhat makes for a good DevOps process? Pin
Dominic Burford5-Aug-20 23:00
professionalDominic Burford5-Aug-20 23:00 
GeneralExecuting async code from non async code Pin
Dominic Burford19-Jul-20 23:21
professionalDominic Burford19-Jul-20 23:21 
GeneralPassing dynamic queries between client and backend server Pin
Dominic Burford29-Jun-20 4:55
professionalDominic Burford29-Jun-20 4:55 
GeneralManaging your Azure resources using Powershell scripting Pin
Dominic Burford13-Mar-20 6:42
professionalDominic Burford13-Mar-20 6:42 
GeneralIntroduction to Azure Cognitive Search Pin
Dominic Burford28-Feb-20 5:39
professionalDominic Burford28-Feb-20 5:39 
GeneralUpdating the version number in your .NET build pipeline Pin
Dominic Burford24-Feb-20 5:33
professionalDominic Burford24-Feb-20 5:33 
GeneralFinding a solution to an Azure web app deployment problem Pin
Dominic Burford23-Jan-20 23:51
professionalDominic Burford23-Jan-20 23:51 
For anyone who uses Azure Powershell scripts, it will come as no surprise that as of November last year, they deprecated all their existing Powershell functions that related to Azure. These have instead been replaced with new Azure Resource Manager (ARM) equivalent functions. These new functions supercede the previous suite of Azure Powershell functions. Microsoft began initially deprecating these as far back as 2018, but due to pressure from the development community, Microsoft delayed this for a further year to give developers more time to find workarounds and / or solutions.

I was blissfully unaware of this fact, as I do not make any direct use of their Azure Powershell functions anywhere in our development ecosystem. I only became aware of the fact that these Azure Powershell functions were deprecated when our Team Foundation Services (TFS) deployments to Azure started failing. Unknown to me, the TFS Azure Web App Deployment task uses an Azure Powershell script to push deployments to Azure. This Powershell script implemented several of the now deprecated Azure Powershell functions. Hence it began failing as the functions it was attempting to invoke no longer existed.

This left me in the rather awkward predicament of not being to deploy any of our ASP.NET Web API services to Azure. No new features could therefore be deployed for any of the apps that consumed these services. All of our web and mobile apps consume these services, so until I found a solution we would be unable to release any new features and / or maintenance fixes for the apps that consumed these services.

I began scrambling to look for a solution. I came across several articles that outlined the replacement functions and how to implement them. This was all well and good, but I didn't particularly want to have to rewrite the entire Microsoft Azure Powershell script that was responsible for deployments using the new ARM functions. I tried looking for a new version of the original Azure Powershell script, but could only find the existing version on Github. There didn't seem to be an updated version of this script anywhere.

I could either rewrite the original Azure Powershell script myself (which for obvious reasons I wasn't particularly keen on doing), or try to find another solution. After some further head scratching, I had an epiphany. Why didn't I write an FTP script that would deploy to Azure? From the Azure portal for a web app, you are able to download the publishing profile. The publishing profile (among other things) contains the FTP details required to connect to your Azure web app.

So I looked at writing a simple FTP script. I needed an FTP client that could be invoked from the command line (and therefore be scripted) as I didn't want this to be a manual task. I wanted this to work exactly as it already did i.e. to be a TFS task (and also because after each deployment to a particular endpoint I run a suite of unit tests to ensure that the code all works correctly from the Azure hosting).

I had previous experience of using WinSCP[^] so knew that this would do the job. I had only ever previously used WinSCP for uploading single files, never for uploading the hundreds of files our ASP.NET Web API services contained. After some further research I discovered that WinSCP contained a command called synchronize. This command would synchronize a local directory with a remote one, including all sub-directories. This was exactly what I needed.

I eventually wrote the following scripts that deploy our services to Azure. They are invoked from our TFS build so there is no change to our deployment process whatsoever.

Here is the batch script that is invoked from the TFS deployment task.
@echo off

"C:\Program Files (x86)\WinSCP\" /script=ftpDeployServices.ftp
Here is the FTP script containing the WinSCP FTP commands (ftpDeployServices.ftp).
option batch abort
option confirm off 
option transfer binary
cd /site/wwwroot
synchronize remote -delete <mylocalfolder> /site/wwwroot
The synchronize command does all the heavy lifting of checking the timestamps and uploading only those files that have changed. The -delete parameter removes any files from the remote site that don't exist on the local site. If no files have been changed since the last deployment, then no files are uploaded. Only those files that have been changed are uploaded. This results in much faster deployments as only the incrementally changed files are ever uploaded.

By hand rolling my own FTP script means that I am no longer at the mercy of any future changes to any Microsoft related Powershell script(s) or infrastructure. This means I have one less headache to worry about. In fact, the updating of the previous Azure Powershell scripts was a blessing in disguise, as my workaround is faster and reduces our dependency on Microsoft infrastructure. A good result given the severity of the impact that this update had on our deployment process.
"There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult." - C.A.R. Hoare

Home | LinkedIn | Google+ | Twitter

GeneralStructured Logging Pin
Dominic Burford24-Dec-19 1:28
professionalDominic Burford24-Dec-19 1:28 
GeneralEnabling TLS 1.2 on your .NET application Pin
Dominic Burford11-Dec-19 23:11
professionalDominic Burford11-Dec-19 23:11 
GeneralThe new version of the app is (almost) ready for release Pin
Dominic Burford7-Nov-19 23:28
professionalDominic Burford7-Nov-19 23:28 
GeneralChunking your lists into multiple smaller lists Pin
Dominic Burford11-Sep-19 3:40
professionalDominic Burford11-Sep-19 3:40 
GeneralWriting flexible filters for your data using Predicates Pin
Dominic Burford16-Jul-19 6:11
professionalDominic Burford16-Jul-19 6:11 
GeneralRe: Writing flexible filters for your data using Predicates Pin
Slacker00716-Jul-19 22:09
professionalSlacker00716-Jul-19 22:09 
GeneralRe: Writing flexible filters for your data using Predicates Pin
Dominic Burford17-Jul-19 1:17
professionalDominic Burford17-Jul-19 1:17 
GeneralBlocking Asynchronous Code Pin
Dominic Burford4-Jul-19 22:11
professionalDominic Burford4-Jul-19 22:11 
GeneralDesigning and implementing flexible RESTful services Pin
Dominic Burford14-Jun-19 0:50
professionalDominic Burford14-Jun-19 0:50 
GeneralWriting asynchronous code with .NET Pin
Dominic Burford10-Jun-19 3:34
professionalDominic Burford10-Jun-19 3:34 
GeneralWeird Minification Behaviour in ASP.NET Core Pin
Dominic Burford28-May-19 3:54
professionalDominic Burford28-May-19 3:54 
GeneralThe Importance of Structure and Dilligence Pin
Dominic Burford24-May-19 6:14
professionalDominic Burford24-May-19 6:14 
GeneralWhen should you rewrite that legacy application? Pin
Dominic Burford22-May-19 0:03
professionalDominic Burford22-May-19 0:03 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.