代码之家  ›  专栏  ›  技术社区  ›  Murilo

使用IIS Express几秒钟后站点停止工作

  •  1
  • Murilo  · 技术社区  · 8 年前

    我必须从WPF应用程序启动IIS Express。我可以启动IISExpress,并在网站上浏览几秒钟。然后,当我单击任何链接时,它都不会加载。然后,如果我关闭WPF应用程序,网页会立即响应。我的代码:

    private void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
       StartSite();
    }
    
    public void StartSite()
    {
        string path = @"C:\Program Files\IIS Express\iisexpress.exe";
        string args = @"/path:C:\Sites /port:9090 /systray:true";
    
       if (!File.Exists(path))
          throw new FileNotFoundException();
    
       var process = Process.Start(new ProcessStartInfo()
       {
         FileName = path,
         Arguments = args,
         RedirectStandardOutput = true,
         UseShellExecute = false,
         CreateNoWindow = true
       });
    }
    

    猜猜看,为什么网站只工作几秒钟,并且在关闭启动iisexpress的应用程序后会再次工作?

    编辑

    我注意到当我在“Debug”中构建时会发生这种情况,但当我在《Release》中构建时,问题不会发生。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Murilo    8 年前

    我通过创建IIS启动器(控制台应用程序)解决了我的问题。我将一些参数传递给这个应用程序,它启动IISExpress,然后终止。现在,在我的WPF应用程序中,我不是为IISExpress创建进程,而是为启动器创建进程。此外,此控制台应用程序还通过退出代码将进程id返回给WPF。

    class Program
    {
        static void Main(string[] args)
        {
            if (args == null)
                Environment.Exit(-1);
    
            string exeIIS = args[0];
            string websitePath = args[1];
            string port = args[2];
    
            string argsIIS = MakeIISExpressArgs(websitePath, port);
            int processID = LaunchIISExpress(argsIIS, exeIIS);
    
            Environment.Exit(processID);
        }
    
        private static int LaunchIISExpress(string argsIIS, string pathExeIIS)
        {
            var process = Process.Start(new ProcessStartInfo()
            {
                FileName = pathExeIIS,
                Arguments = argsIIS,
                RedirectStandardOutput = true,
                UseShellExecute = false,
                CreateNoWindow = true
            });
    
            return process.Id;
        }
    
        private static string MakeIISExpressArgs(string websitePath, string port)
        {
            var argsIIS = new StringBuilder();
            argsIIS.Append(@"/path:" + websitePath);
            argsIIS.Append(@" /Port:" + port);
            return argsIIS.ToString();
        }
    
    }