Hi

Automatically publish/deploy an ASP.NET application to IIS using C#

 using System;

using System.Configuration;

using System.IO;


class Program

{

    static void Main()

    {

        string sourcePath =

            ConfigurationManager.AppSettings["SourcePath"];


        string destinationPath =

            ConfigurationManager.AppSettings["DestinationPath"];


        string poolname =

            ConfigurationManager.AppSettings["Poolname"];


        bool hasFiles =

            Directory.Exists(sourcePath) &&

            Directory.GetFiles(sourcePath, "*", SearchOption.AllDirectories).Length > 0;


        if (hasFiles)

        {

            // Stop IIS App Pool

            Run(

                $@"C:\Windows\system32\inetsrv\appcmd stop apppool /apppool.name:""{poolname}""",

                "step1"

            );


            // Copy files

            Run(

                $@"robocopy ""{sourcePath}"" ""{destinationPath}"" /E /MOV /R:1 /W:1",

                "step2"

            );


            // Start IIS App Pool

            Run(

                $@"C:\Windows\system32\inetsrv\appcmd start apppool /apppool.name:""{poolname}""",

                "step3"

            );

        }

        else

        {

            Console.WriteLine("No files found in source path.");

        }

    }


    static void Run(string cmd, string step)

    {

        Console.WriteLine(step);


        var psi = new System.Diagnostics.ProcessStartInfo

        {

            FileName = "cmd.exe",

            Arguments = "/c " + cmd,

            Verb = "runas",

            UseShellExecute = true

        };


        using (var p = System.Diagnostics.Process.Start(psi))

        {

            p.WaitForExit();

        }

    }

}


  Use the values from App.config directly instead of hardcoded paths.


App.config

<configuration>
<appSettings>

<add key="SourcePath"
value="F:\AutoPublish\Api"/>

<add key="DestinationPath"
value="C:\inetpub\wwwroot\solution"/>

<add key="Poolname"
value="abc.com"/>

</appSettings>
</configuration>

Advantage

Now you can change:

  • source folder
  • destination folder
  • IIS app pool

without recompiling the application.

OptionResult
/MOVMove files only
/MOVEMove files + directories


IIS Deployment Command

Run(@"robocopy D:\vinu\pubtest D:\publish\publishfolder /E /MOV /R:1 /W:1", "step2");

This:

  • Copies everything
  • Removes source files
  • Keeps root folder
  • Retries once only
  • Faster deployment  
Previous
Next Post »