PerformanceCounter.NextValue()抛出InvalidOperationException

时间:2012-05-24 14:47:47

标签: c# iis-7.5 windows-server-2008-r2 performancecounter invalidoperationexception

这是创建性能计数器的代码:

var ftpPerfCounter = new PerformanceCounter("FTP Service", "Current Connections", "_Total");

这是异常发生的地方:

int cnt = (int)Math.Round(ftpPerfCounter.NextValue());

以下是Exception消息:

  

“错误消息:指定类别的计数器布局无效,       类型的计数器:AverageCount64,AverageTimer32,CounterMultiTimer,CounterMultiTimerInverse,CounterMultiTimer100Ns,CounterMultiTimer100NsInverse,RawFraction或SampleFraction       必须紧跟任何基本计数器类型:AverageBase,CounterMultiBase,RawBase或SampleBase。“

错误消息非常神秘。我不确定将来如何避免这种例外。

详细

这发生在Windows Server 2008 R2 64位操作系统上。 FTP服务器是IIS。

3 个答案:

答案 0 :(得分:2)

至少在我的带有IIS 7.5的Windows Server 2008 R2上,性能计数器类别称为“Microsoft FTP服务”而不是“FTP服务”。也许它对于不同的OS / IIS版本是不同的,但它很容易检查。

在目标服务器/机器上:

  1. 运行“性能监视器”
  2. 点击左侧导航窗格中的“效果监视器”
  3. 点击加号图标以添加效果计数器
  4. 向下滚动可用计数器列表。寻找FTP或Microsoft FTP以查看它是否存在...请注意,如果您没有安装Microsoft FTP服务,您将看不到性能计数器。
  5. 找到后,选择它,您将看到可以查询的特定计数器实例的列表。其中一个例子是你感兴趣的'_Total'。
  6. 当然,这也证明性能计数器的工作原理与您的代码无关。这是一件好事!

    有关如何使用Performance Counters in C#/.NET see this stackoverflow post的具体最佳做法。

答案 1 :(得分:1)

我没有在我的电脑上安装IIS,但如果我这样做,那就是我要尝试的:

  1. 尝试通过从Server Explorer拖放来使用Visual Studio的代码生成器来生成WMI。检查生成的代码,看看代码是否有任何差异。
  2. 使用反射器查看抛出异常的位置,在BCL中设置自定义断点并重现。然后分析调用堆栈内容并查找可疑代码路径或意外状态。

答案 2 :(得分:0)

他们似乎已经解决了类似的问题here。也许你必须建立一个基地柜台?