【问题标题】:Unable to restart windows service from my ASP.NET application无法从我的 ASP.NET 应用程序重新启动 Windows 服务
【发布时间】:2011-05-04 09:45:27
【问题描述】:

我正在尝试使用以下代码从我的 asp.net 应用程序重新启动 Windows 时间服务,但它总是返回一个 TimeoutException。我尝试了各种方法来消除此错误并重新启动服务,但不幸的是它失败了。我为此目的使用的代码如下所示:

private ServiceController service = new ServiceController( "W32Time", Environment.MachineName );
private TimeSpan timeout = TimeSpan.FromMilliseconds( 35000 );//15000 was the old value

// Restart W32Time Service
private void RestartService( )
{
    try
    {
        // Stop service if it is running
        if( service.Status == ServiceControllerStatus.Running )
        {
            service.Stop( );
            service.WaitForStatus( ServiceControllerStatus.Stopped, timeout );
        }

        // Start service if it is stopped
        if( service.Status == ServiceControllerStatus.Stopped )
        {
            if (!(service.Status.Equals(ServiceControllerStatus.Stopped) || service.Status.Equals(ServiceControllerStatus.StopPending)))
            {
                service.Stop();
            }

            service.Start( );
            service.WaitForStatus( ServiceControllerStatus.Running, timeout );
        }
    }
    catch( Exception ex )
    {
        log.Error( "Error in restarting windows service.", ex );
    }
}

我使用的是 Windows 7。谁能建议我解决这个问题?任何帮助将不胜感激。

【问题讨论】:

  • 运行应用的账号是否有权限访问服务?

标签: c# asp.net service


【解决方案1】:

Davids 评论是相关的,您还必须检查对 W32time 服务的依赖关系。有可能不存在吗?但如果是这样,它可能会给你带来问题。如果是 64 位机器,我会检查 'W32..' 的相关性

[编辑] 我附上了一些至少可以在另一台 Windows 7 计算机上运行的代码示例。您在上面提供的代码对我来说也适用。

class Program
{
    static void Main()
    {
        WindowsServiceManager service = new WindowsServiceManager();
        service.Run("W32Time", 2000);
        service.End("W32Time", 2000);
    }
}

public class WindowsServiceManager
{
    internal void Run(string serviceId, int timeOut)
    {
        using (ServiceController serviceController = new ServiceController(serviceId))
        {
            TimeSpan t = TimeSpan.FromMilliseconds(timeOut);
            serviceController.Start();
            serviceController.WaitForStatus(ServiceControllerStatus.Running, t);
        }
    }

    internal void End(string serviceId, int timeOut)
    {
        using (ServiceController serviceController = new ServiceController(serviceId))
        {
            TimeSpan t = TimeSpan.FromMilliseconds(timeOut);
            serviceController.Stop();
            serviceController.WaitForStatus(ServiceControllerStatus.Stopped, t);
        }
    }
}

【讨论】:

  • 名称在 64 位上仍然是 W32Time。顺便说一句,default W32Time 没有依赖关系。
  • @Mark 你明白了,我没有从我的安卓系统中检查。在某些情况下,这些是问题描述的完全合法情况。我会说我自己成功地尝试了 W32Time。服务是否完全可以手动启动和停止(通过服务对话框)?你能用你的 .NET 控制其他事件吗? W32Time 似乎也作为本地服务运行,这将使我尝试省略第二个参数“Environment.MachineName”以使类实例化找到该帐户本身(tinyurl.com/6xlktbr,msdn)。
  • 感谢 Joanas 的回答,即使在手动重新启动我的 Windows 时间服务时也存在问题,因此在咨询我们的网络管理员后,我已经找到了解决方案,即我发布的代码在计算机上运行良好超出我们的域,所以问题是我的帐户授权。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2011-05-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2020-09-06
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
相关资源
最近更新 更多