-1

我正在尝试使用PerformanceCounters. 代码:

PerformanceCounter cpuCounter;

cpuCounter = new PerformanceCounter();
cpuCounter.CategoryName = "Processor";
cpuCounter.CounterName = "% Processor Time";
cpuCounter.InstanceName = "_Total";

var result = cpuCounter.NextValue();//ERROR HERE

我收到未经授权的异常。我该如何解决这个问题?

编辑1:
我试图为处理器计数和内存设置当前实例名称,但没有运气......

编辑2:
例外.ToString()

System.UnauthorizedAccessException:对注册表项“全局”的访问被拒绝。在 Microsoft.Win32.RegistryKey.Win32Error(Int32 errorCode, String str) 在 Microsoft.Win32.RegistryKey.InternalGetValue(String name, Object defaultValue, Boolean doNotExpand, Boolean checkSecurity) 在 Microsoft.Win32.RegistryKey.GetValue(String name) 在 System System.Diagnostics.PerformanceCounterLib.get_CategoryTable() 中 System.Diagnostics.PerformanceCounterLib.GetPerformanceData(String item) 的 .Diagnostics.PerformanceMonitor.GetData(String item) (String category, String counter, Boolean & categoryExists)在 System.Diagnostics.PerformanceCounterLib.CounterExists(String machine, String category, String counter) 在 System.Diagnostics.PerformanceCounter.InitializeImpl() 在 System.Diagnostics。

4

1 回答 1

3

根据异常信息,表明我们无权访问Performance Monitor。由于 WebApp 是一个沙盒,如果我们使用 Azure WebApp,我们将无权执行此操作。

用户帐户必须是管理员组的成员或Windows中性能监视器用户组的成员。

我的建议是我们可以使用 Application Insight 来做到这一点。我们需要为 WebApp 配置 Application Insight,更多细节请参考文档。关于 Application Insight 中的性能计数器,我们可以参考这篇教程

如果我们尝试使用 Application Insight API,我们需要创建一个 Apikey。我们还可以从文档中获取演示代码。它对我来说可以正常工作。

  static void Main(string[] args)
        {
            var applicationId = "xxxxxxxx";
            var applicationKey = "xxxxxxxx";
            var queryPath = "performanceCounters/processCpuPercentage";
            var queryType = "metrics";
            var str = GetTelemetry(applicationId, applicationKey, queryType, queryPath, "");


        }

 public static string GetTelemetry(string appid, string apikey,
            string queryType, string queryPath, string parameterString)
        {
            HttpClient client = new HttpClient();
            client.DefaultRequestHeaders.Accept.Add(
                new MediaTypeWithQualityHeaderValue("application/json"));
            client.DefaultRequestHeaders.Add("x-api-key", apikey);
            var req = string.Format(Url, appid, queryType, queryPath, parameterString);
            HttpResponseMessage response = client.GetAsync(req).Result;
            if (response.IsSuccessStatusCode)
            {
                return response.Content.ReadAsStringAsync().Result;
            }
            else
            {
                return response.ReasonPhrase;
            }
        }

在此处输入图像描述

于 2017-08-02T05:50:01.023 回答