Skip to content

Instantly share code, notes, and snippets.

@thomas-weller
Last active November 24, 2017 22:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save thomas-weller/bcb5291cc3e151bd3440 to your computer and use it in GitHub Desktop.
Save thomas-weller/bcb5291cc3e151bd3440 to your computer and use it in GitHub Desktop.
Helper class for using IIS Express programmatically - see http://blog.thomas-weller.de/a-handy-iis-express-test-helper-class for details
using System;
using System.Diagnostics;
using System.IO;
namespace IisExpress
{
/// <summary>
/// Helper class for running IIS Express. Basically a convenient wrapper around IIS Express' command line.
/// </summary>
public class IisExpress
{
#region Fields
private Process _process;
#endregion // Fields
#region Properties
/// <summary>
/// The path to the <c>iisexpress.exe</c> executable. Defaults to the default installation path
/// (e.g. <c>C:\Program Files (x86)\IIS Express\iisexpress.exe</c>), if not explicitely set.
/// </summary>
public string ExePath { get; set; }
/// <summary>
/// Path to the IIS Express configuration file. Defaults to <c>USER\DOCUMENTS\IISExpress\config\applicationhost.config</c>.
/// </summary>
public string ConfigPath { get; set; }
/// <summary>
/// The application pool that IIS Express should use. Defaults to <c>"Clr4IntegratedAppPool"</c>.
/// </summary>
public string AppPool { get; set; }
/// <summary>
/// Gets a value indicating whether the associated IIS Express instance is currently running.
/// </summary>
public bool IsRunning { get { return _process != null; } }
#endregion // Properties
#region Operations
/// <summary>
/// Starts IIS Express with the specified website.
/// </summary>
/// <param name="site">The website that IIS Express should host.</param>
/// <exception cref="ArgumentNullException">
/// Argument <paramref name="site"/> is null.
/// </exception>
/// <exception cref="InvalidOperationException">
/// There already is an associated IIS Express instance running (i.e. <see cref="IsRunning"/> is true).
/// </exception>
/// <exception cref="FileNotFoundException">
/// Either <see cref="ExePath"/> or <see cref="ConfigPath"/> could not be found.
/// </exception>
public void Start(string site)
{
if (site == null)
{
throw new ArgumentNullException("site");
}
if (_process != null)
{
throw new InvalidOperationException("IIS Express is already running.");
}
SetDefaultsWhereNecessary();
if (!File.Exists(ExePath))
{
throw new FileNotFoundException("Path to IIS Express executable is invalid: '" + ExePath + "'.");
}
if (string.IsNullOrEmpty(ConfigPath) || !File.Exists(ConfigPath))
{
throw new FileNotFoundException("Path to IIS Express configuration file is invalid: '" + ConfigPath + "'.");
}
_process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = ExePath,
Arguments = string.Format(
"/config:\"{0}\" /site:\"{1}\" /apppool:\"{2}\"",
Path.GetFullPath(ConfigPath),
site,
AppPool),
RedirectStandardOutput = true,
RedirectStandardInput = true,
UseShellExecute = false,
CreateNoWindow = true
}
};
_process.Start();
}
/// <summary>
/// Stops the IIS Express instance that was formerly started via the <see cref="Start"/> method.
/// </summary>
public void Stop()
{
if (_process != null)
{
_process.Kill();
_process.WaitForExit();
_process = null;
}
}
#endregion // Operations
#region Implementation
private void SetDefaultsWhereNecessary()
{
if (string.IsNullOrEmpty(ExePath))
{
ExePath = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86),
@"IIS Express\iisexpress.exe");
}
if (string.IsNullOrEmpty(ConfigPath))
{
ConfigPath = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
@"IISExpress\config\applicationhost.config");
}
if (string.IsNullOrEmpty(AppPool))
{
AppPool = "Clr4IntegratedAppPool";
}
}
#endregion // Implementation
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment