Как я могу программно запустить ASP.Net Development Server с помощью C#?
У меня есть веб-страницы ASP.NET, для которых я хочу создавать автоматизированные тесты (используя WatiN & MBUnit). Как мне запустить ASP.Net Development Server из моего кода? Я не хочу использовать IIS.
4 ответа
Из того, что я знаю, вы можете запустить сервер dev из командной строки со следующим путем / синтаксисом:
C:\Windows\Microsoft.NET\Framework\v2.0.50727\Webdev.WebServer.exe /port:[PORT NUMBER] /path: [PATH TO ROOT]
... чтобы я мог представить, что вы можете легко использовать Process.Start() для запуска нужных вам деталей через некоторый код.
Естественно, вы захотите настроить этот номер версии на то, что вам больше всего нужно.
Вот что я использовал, чтобы работал:
using System;
using System.Diagnostics;
using System.Web;
...
// settings
string PortNumber = "1162"; // arbitrary unused port #
string LocalHostUrl = string.Format("http://localhost:{0}", PortNumber);
string PhysicalPath = Environment.CurrentDirectory // the path of compiled web app
string VirtualPath = "";
string RootUrl = LocalHostUrl + VirtualPath;
// create a new process to start the ASP.NET Development Server
Process process = new Process();
/// configure the web server
process.StartInfo.FileName = HttpRuntime.ClrInstallDirectory + "WebDev.WebServer.exe";
process.StartInfo.Arguments = string.Format("/port:{0} /path:\"{1}\" /virtual:\"{2}\"", PortNumber, PhysicalPath, VirtualPath);
process.StartInfo.CreateNoWindow = true;
process.StartInfo.UseShellExecute = false;
// start the web server
process.Start();
// rest of code...
Основываясь на полезном ответе @Ray Vega и важном обновлении @James McLachlan для VS2010, вот моя реализация, охватывающая VS2012 и откат к VS2010 при необходимости. Я также решил не выбирать только в Environment.Is64BitOperatingSystem, потому что в моей системе он не работал. То есть у меня 64-битная система, но веб-сервер находился в 32-битной папке. Поэтому мой код сначала ищет 64-битную папку и, при необходимости, возвращается к 32-битной.
public void LaunchWebServer(string appWebDir)
{
var PortNumber = "1162"; // arbitrary unused port #
var LocalHostUrl = string.Format("http://localhost:{0}", PortNumber);
var VirtualPath = "/";
var exePath = FindLatestWebServer();
var process = new Process
{
StartInfo =
{
FileName = exePath,
Arguments = string.Format(
"/port:{0} /nodirlist /path:\"{1}\" /virtual:\"{2}\"",
PortNumber, appWebDir, VirtualPath),
CreateNoWindow = true,
UseShellExecute = false
}
};
process.Start();
}
private string FindLatestWebServer()
{
var exeCandidates = new List<string>
{
BuildCandidatePaths(11, true), // vs2012
BuildCandidatePaths(11, false),
BuildCandidatePaths(10, true), // vs2010
BuildCandidatePaths(10, false)
};
return exeCandidates.Where(f => File.Exists(f)).FirstOrDefault();
}
private string BuildCandidatePaths(int versionNumber, bool isX64)
{
return Path.Combine(
Environment.GetFolderPath(isX64
? Environment.SpecialFolder.CommonProgramFiles
: Environment.SpecialFolder.CommonProgramFilesX86),
string.Format(
@"microsoft shared\DevServer\{0}.0\WebDev.WebServer40.EXE",
versionNumber));
}
Я надеюсь, что информированный читатель сможет предоставить соответствующее заклинание для VS2013, поскольку он, очевидно, использует еще одну схему...
Вы можете легко использовать Process Explorer, чтобы найти полные параметры командной строки, необходимые для его ручного запуска. Запустите Process Explorer при отладке вашего сайта. Для VS2012 разверните узел "devenv.exe". Щелкните правой кнопкой мыши на "WebDev.WebServer20.exe" и оттуда вы увидите значения пути и командной строки.