iis-express - 如何将 IIS Express 作为通过 Windows 服务启动的进程运行

标签 iis-express

我正在尝试使用我的应用程序分发 IIS Express。 IIS Express 将在端口 80 上处理外部 Web 请求。

我在运行 IIS Express 以及处理外部请求时没有任何问题,但是 Microsoft 以其无限的智慧决定从控制台窗口和系统托盘项运行 IIS Express。您可以通过命令行参数禁用托盘项目,但不能通过控制台窗口禁用。

我想在不显示控制台窗口的情况下运行 IIS Express。我还想从 Windows 服务运行 IIS Express。

在我的应用程序中运行以下代码完全符合我的要求:

    Directory.SetCurrentDirectory(string.Format("{0}\\IIS Express", iisProgramDirectory));
    process.EnableRaisingEvents = true;
    //process.Exited += new EventHandler(process_Exited);
    process.StartInfo.FileName = "iisexpress.exe";
    process.StartInfo.Arguments = string.Format("\"/config:{0}webservice\\config\\applicationhost.config\"", dataDirectory);
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.RedirectStandardOutput = true;
    process.StartInfo.RedirectStandardError = true;
    process.StartInfo.CreateNoWindow = true;
    process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    //process.StartInfo.UserName = "Administrator";
    //System.Security.SecureString securePwd = new System.Security.SecureString();
    //string password = "**********";
    //char[] pword = password.ToCharArray();
    //for (int i = 0; i < pword.Length; i++)
    //{
    //  securePwd.AppendChar(pword[i]);
    //}
    //process.StartInfo.Password = securePwd;
    process.Start();

显然我以管理员身份运行。 IIS Express 显然需要以管理员权限运行才能为外部请求提供服务并监听端口 80。

我的 Windows 服务在我认为具有完全权限的 Windows 服务帐户下运行,但是当我尝试从 Windows 服务运行它时,IIS Express 进程只是优雅地退出,错误代码为 0。

我已经尝试了许多场景(正如您从代码片段中看到的那样),但似乎无法使用我的 Windows 服务运行 IIS Express 并隐藏该死的控制台窗口。

任何建议将不胜感激。

最佳答案

答案如:
string IIS_EXPRESS = @"C:\Program Files\IIS Express\iisexpress.exe";

    StringBuilder arguments = new StringBuilder();
    arguments.Append(@"/path:");
    arguments.Append(@"C:\Inetpub\wwwroot\ClientSyncService");
    arguments.Append(@" /Port:2000");
    Process process = Process.Start(new ProcessStartInfo()
        {
            FileName = IIS_EXPRESS,
            Arguments = arguments.ToString(),
            RedirectStandardOutput = true,
            UseShellExecute = false,
            CreateNoWindow = true
        });

应该可行,但诀窍是您需要为服务的身份授予 ACL,以便它可以拥有端口 80。
换句话说,在你的安装程序中(假设你有一个可以提升运行的 MSI),让它运行一个像下面这样的命令行:
netsh http 添加 urlacl url=http://WhateverMachineName:80/user=everyone

您可以将“所有人”限制为仅用于运行服务的特定帐户。当您这样做时,IIS express 应该能够正常启动而无需管理员权限。

关于iis-express - 如何将 IIS Express 作为通过 Windows 服务启动的进程运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4931374/

相关文章:

visual-studio - Visual Studio ASP.NET Core 调试 IIS Express - 无法访问站点

asp.net-mvc - 无法使用 IIS Express 在 Windows 10 上运行 Web 应用程序

c# - 为什么 IIS 8.0 Express 在 Visual Studio 2012 中重命名后使用旧项目名称

iis - 如何判断我安装的是 IIS Express 还是完整版?

asp.net-core - 在 Visual Studio 中调试 ASP.NET Core 应用程序

visual-studio-2010 - 允许 Android 设备在同一网络上访问 IIS Express

visual-studio-2012 - VS2012 如何映射 IIS Express 站点名称?

visual-studio-2015 - Microsoft Bot Framework,Visual Studio 2015和2017出现启动错误

visual-studio-2012 - Visual Studio 2012 IIS Express 8 全新安装 - 无法连接

asp.net - 如何在 Visual Studio 项目中更改 IIS Express 站点名称