问题 如何使用C#以编程方式运行ASP.Net开发服务器?


我有ASP.NET网页,我想为其构建自动化测试(使用WatiN和MBUnit)。如何从我的代码启动ASP.Net开发服务器?我不想使用IIS。


12685
2017-09-11 17:00


起源



答案:


据我所知,您可以使用以下路径/语法从命令提示符启动dev服务器:

C:\Windows\Microsoft.NET\Framework\v2.0.50727\Webdev.WebServer.exe /port:[PORT NUMBER] /path: [PATH TO ROOT]

...所以我可以想象你可以轻松地使用Process.Start()通过一些代码启动你需要的细节。

当然,您需要将该版本号调整为最新/最适合您的版本号。


7
2017-09-11 17:09



如果webdev.webserver.exe不在该文件夹中,它可能位于C:\ Program Files \ Common Files \ Microsoft Shared \ DevServer \ 9.0(我找到它的位置) - Casper
这是2013年 stackoverflow.com/questions/4772092/... - Recursor
也许使用相对路径? START / D%WEBDEV40%/ B WebDev.WebServer40.exe / port:9195 /path:"..\..\Reale.VSIntegration\Reale.VSIntegration.SvcDespliegue.Host“ 不适合我 - Kiquenet


答案:


据我所知,您可以使用以下路径/语法从命令提示符启动dev服务器:

C:\Windows\Microsoft.NET\Framework\v2.0.50727\Webdev.WebServer.exe /port:[PORT NUMBER] /path: [PATH TO ROOT]

...所以我可以想象你可以轻松地使用Process.Start()通过一些代码启动你需要的细节。

当然,您需要将该版本号调整为最新/最适合您的版本号。


7
2017-09-11 17:09



如果webdev.webserver.exe不在该文件夹中,它可能位于C:\ Program Files \ Common Files \ Microsoft Shared \ DevServer \ 9.0(我找到它的位置) - Casper
这是2013年 stackoverflow.com/questions/4772092/... - Recursor
也许使用相对路径? START / D%WEBDEV40%/ B WebDev.WebServer40.exe / port:9195 /path:"..\..\Reale.VSIntegration\Reale.VSIntegration.SvcDespliegue.Host“ 不适合我 - Kiquenet


这就是我用过的方法:

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...

8
2017-09-11 23:20



对于.NET 4,WebDev.WebServer40.exe位于程序文件(或程序文件(x86))\ Microsoft Shared \ DevServer \ 10.0中。您可以使用Environment.Is64BitOperatingSystem来帮助确定要查找的文件夹。顺便说一下,您可以使用Environment.GetFolderPath(Environment.SpecialFolder.CommonProgramFiles)或Environment.GetFolderPath(Environment.SpecialFolder.CommonProgramFilesX86)获取文件夹。 - James McLachlan
另一条路径:%ProgramFiles(x86)%\ Common Files \ Microsoft Shared \ DevServer \ 11.0 \中的WebDev.WebServer40.exe - Kiquenet


基于@Ray Vega的有用答案以及@James McLachlan对VS2010的重要更新,这里是我的实现,以涵盖VS2012并在必要时回退到VS2010。我还选择不在Environment.Is64BitOperatingSystem上选择,因为它在我的系统上出错了。也就是说,我有一个64位系统,但Web服务器在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提供适当的咒语,因为它显然使用了不同的方案......


1
2017-11-07 20:17



对于2013年,它使用IIS Express,这里是如何使用它。 stackoverflow.com/questions/4772092/... - Recursor
@Recursor:感谢2013参考! - Michael Sorens


你可以轻松使用 Process Explorer 找到手动启动它所需的完整命令行选项。 在调试网站时启动Process Explorer。对于VS2012,展开“devenv.exe”节点。右键单击“WebDev.WebServer20.exe”,然后从中可以看到“路径”和“命令行”值。


0
2017-07-26 08:44