You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过C#代码正确重启IIS Server,解决现有实现的异常及耗时问题?

正确实现C#重启IIS服务的方案

问题原因分析

  • 偶发异常:你当前的代码未处理服务依赖、未做异常捕获,W3SVC服务运行时如果有站点请求、应用池进程占用,直接调用Stop()会触发未处理异常,你看到的即时调试报错只是系统默认的未处理异常触发提示,和Visual Studio是否开启无关。
  • 耗时过长:IIS管理器的重启操作走的是IIS内置的优雅重启逻辑,会先卸载应用域、停止站点请求处理再重启核心服务,而你直接硬启停W3SVC服务需要等待所有关联进程强制退出,额外增加了耗时。

正确实现方式

这里提供两种稳定方案:

方案1:调用系统内置iisreset命令(推荐,和IIS管理器效果一致,速度最快)

直接调用系统自带的iisreset工具,无需额外引用组件,重启耗时和IIS管理器基本一致:

using System.Diagnostics;

public static void RestartIIS()
{
    // 确保进程以*管理员身份*运行
    ProcessStartInfo psi = new ProcessStartInfo("iisreset.exe", "/restart")
    {
        UseShellExecute = false,
        CreateNoWindow = true,
        RedirectStandardOutput = true,
        RedirectStandardError = true
    };

    using (Process p = Process.Start(psi))
    {
        p.WaitForExit();
        // 可以在这里读取输出判断是否执行成功
        string output = p.StandardOutput.ReadToEnd();
        string error = p.StandardError.ReadToEnd();
        if (p.ExitCode != 0)
        {
            // 处理重启失败逻辑
            throw new Exception($"IIS重启失败:{error}");
        }
    }
}

方案2:优化ServiceController实现

如果必须用服务控制的方式,需要补充状态等待、异常捕获和依赖处理:

using System.ServiceProcess;
using System.Linq;

public static ServiceController GetService(string name)
{
    return ServiceController.GetServices()
        .FirstOrDefault(x => x.ServiceName == name);
}

public static void StopW3Svc()
{
    string serviceName = "W3SVC";
    var service = GetService(serviceName);
    if (service == null) return;

    try
    {
        // 先判断服务是否处于可停止状态
        if (service.Status != ServiceControllerStatus.Running || !service.CanStop)
        {
            return;
        }
        
        // 停止服务,自动处理依赖服务
        service.Stop(true);
        // 最多等待10秒直到服务完全停止
        service.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(10));
    }
    catch (Exception ex)
    {
        // 捕获异常避免未处理错误,可根据需求记录日志
        throw new Exception($"停止W3SVC服务失败:{ex.Message}", ex);
    }
}

public static void StartW3Svc()
{
    string serviceName = "W3SVC";
    var service = GetService(serviceName);
    if (service == null) return;

    try
    {
        if (service.Status != ServiceControllerStatus.Stopped)
        {
            return;
        }
        
        service.Start();
        // 最多等待10秒直到服务完全启动
        service.WaitForStatus(ServiceControllerStatus.Running, TimeSpan.FromSeconds(10));
    }
    catch (Exception ex)
    {
        throw new Exception($"启动W3SVC服务失败:{ex.Message}", ex);
    }
}

注意事项

  • 所有操作都需要控制台应用以管理员身份运行,否则会没有权限操作服务或者调用iisreset
  • 如果只需要重启单个站点而不是整个IIS服务,可以引用Microsoft.Web.Administration程序集,直接操作对应站点的启停,速度更快影响范围更小

内容的提问来源于stack exchange,提问作者ssrdop

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 08:27:04