0

在使用 SignalR 运行性能监视过程时,我即将实时返回 JSON(尽管它不起作用)。目前,一旦该过程完成,我可以获得完整的 JSON 返回,但我想实现它,以便在应用程序从程序计数器获取值时每秒返回 JSON。问题是,我的 Invoke 调用根本没有做任何事情,即使我在从性能监控中检索到的每个值期间明确地返回要发送到浏览器的数据。

我正在使用 ASP.NET MVC 4 Web API 来开发 API,并通过浏览器中的 URL 调用 API 并返回 JSON。我正在尝试使用 SignalR 让应用程序将 JSON 发送到浏览器,但它根本没有做任何事情。相反,一旦过程完成,应用程序只需从控制器操作返回完整的 JSON 以及所有性能数据值。换句话说,SignalR 不工作。

所以,我需要一些帮助来弄清楚为什么 SignalR 没有向浏览器发送任何数据,这样我才能获得实时提​​要并结束这个项目。

请注意:由于我将 JSON 直接发送到浏览器,因此调用这样做是在模型类而不是视图中完成的,因为当您通过 URL 调用返回 JSON 时,您无法使用视图到 Web API。请记住,我不是在使用视图,而只是使用浏览器和对 API 的 URL 调用。

任何指向正确方向的帮助将不胜感激,谢谢。如果我问的是一个愚蠢的问题,我很抱歉,但我一直在努力解决这个问题,根本找不到解决方案。

这是我的中心课程。它位于 ~/signalr 并位于名为 LiveHub.cs 的文件中。Send 方法是我试图在下一个代码块中看到的方法中调用的方法。

namespace PerfMon2.signalr
{
    public class LiveHub : Hub
    {

        public List<DataValueInfo> Send(List<DataValueInfo> data)
        {
            return data;
        }
    }
}

这是 LogDBRepository.cs 中包含 SignalR 调用的方法。

public List<LogInfo> LogTimedPerfData(string macName, string categoryName, string counterName,
                                          string instanceName, string logName, string live, long? seconds)
    {
        iModsDBRepository modsDB = new iModsDBRepository();
        List<MachineInfo> theMac = modsDB.GetMachineByName(macName);

        if (theMac.Count == 0)
            return new List<LogInfo>();

        else if (instanceName == null)
        {
            if (!PerformanceCounterCategory.Exists(categoryName, macName) ||
                !PerformanceCounterCategory.CounterExists(counterName, categoryName, macName) )
            {
                return new List<LogInfo>();
            }
        }
        else if (instanceName != null)
        {
            if (!PerformanceCounterCategory.Exists(categoryName, macName) ||
                !PerformanceCounterCategory.CounterExists(counterName, categoryName, macName) ||
                !PerformanceCounterCategory.InstanceExists(instanceName, categoryName, macName))
            {
                return new List<LogInfo>();
            }
        }
        else if (logName == null)
        {
            return new List<LogInfo>();
        }

        // Check if entered log name is a duplicate for the authenticated user
        List<LogInfo> checkDuplicateLog = this.GetSingleLog(logName);
        if (checkDuplicateLog.Count > 0)
        {
            return new List<LogInfo>();
        }

        PerformanceCounterCategory category = new PerformanceCounterCategory(categoryName, theMac[0].MachineName);
        if (category.CategoryName == null || category.MachineName == null)
        {
            return new List<LogInfo>();
        }

        List<LogInfo> logIt = new List<LogInfo>();
        if (category.CategoryType != PerformanceCounterCategoryType.SingleInstance)
        {
            List<InstanceInfo> instances = modsDB.GetInstancesFromCatMacName(theMac[0].MachineName, category.CategoryName);

            foreach (InstanceInfo inst in instances)
            {
                if (!category.InstanceExists(inst.InstanceName))
                {
                    continue;
                }
                else if (inst.InstanceName.Equals(instanceName, StringComparison.OrdinalIgnoreCase))
                {
                    PerformanceCounter perfCounter = new PerformanceCounter(categoryName, counterName,
                                                                        inst.InstanceName, theMac[0].MachineName);

                    //CounterSample data = perfCounter.NextSample();
                    //double value = CounterSample.Calculate(data, perfCounter.NextSample());
                    string data = "";
                    List<UserInfo> currUser = this.GetUserByName(WindowsIdentity.GetCurrent().Name);

                    string timeStarted = DateTime.Now.ToString("MM/dd/yyyy - h:mm:ss tt");

                    List<string> dataValues = new List<string>();

                    var hubConnection = new HubConnection("http://localhost/PerfMon2");
                    hubConnection.Credentials = CredentialCache.DefaultNetworkCredentials;
                    var perfMon = hubConnection.CreateProxy("LiveHub");
                    // perfMon.On("sendValue", message => Console.WriteLine(message));
                    hubConnection.Start().Wait();

                    List<DataValueInfo> lol = new List<DataValueInfo>();
                    for (int i = 0; i < seconds; i++)
                    {
                        data = "Value " + i + ": " + perfCounter.NextValue().ToString();
                        //dataValues[i] = data;
                        dataValues.Add(data);
                        lol.Add(new DataValueInfo
                        {
                            Value = perfCounter.NextValue().ToString()
                        });
                        perfMon.Invoke<List<DataValueInfo>>("Send", lol);
                        Thread.Sleep(1000);
                    }
                    string timeFinished = DateTime.Now.ToString("MM/dd/yyyy - h:mm:ss tt");

                    Log log = new Log
                    {
                        LogName = logName,
                        CounterName = perfCounter.CounterName,
                        InstanceName = perfCounter.InstanceName,
                        CategoryName = perfCounter.CategoryName,
                        MachineName = perfCounter.MachineName,
                        TimeStarted = timeStarted,
                        TimeFinished = timeFinished,
                        PerformanceData = string.Join(",", dataValues),
                        UserID = currUser[0].UserID
                    };
                    this.CreateLog(log);
                    logIt.Add(new LogInfo
                    {
                        LogName = logName,
                        CounterName = perfCounter.CounterName,
                        InstanceName = perfCounter.InstanceName,
                        CategoryName = perfCounter.CategoryName,
                        MachineName = perfCounter.MachineName,
                        TimeStarted = timeStarted,
                        TimeFinished = timeFinished,
                        PerformanceData = dataValues.ToList<string>()
                    });
                    break;
                }
            }
        }
        else
        {
            PerformanceCounter perfCounter = new PerformanceCounter(categoryName, counterName,
                                                                        "", theMac[0].MachineName);


            string data = "";
            List<UserInfo> currUser = this.GetUserByName(WindowsIdentity.GetCurrent().Name);

            string timeStarted = DateTime.Now.ToString("MM/dd/yyyy - h:mm:ss tt");

            //string[] dataValues = new string[(int)seconds];
            List<string> dataValues = new List<string>();

            var hubConnection = new HubConnection("http://localhost/PerfMon2");
            hubConnection.Credentials = CredentialCache.DefaultNetworkCredentials;
            var perfMon = hubConnection.CreateProxy("LiveHub");
            // perfMon.On("sendValue", message => Console.WriteLine(message));
            hubConnection.Start().Wait();

            List<DataValueInfo> lol = new List<DataValueInfo>();
            for (int i = 0; i < seconds; i++)
            {
                data = "Value " + i + ": " + perfCounter.NextValue().ToString();
                //dataValues[i] = data;
                dataValues.Add(data);
                lol.Add(new DataValueInfo
                {
                    Value = perfCounter.NextValue().ToString()
                });
                perfMon.Invoke<List<DataValueInfo>>("Send", lol);
                Thread.Sleep(1000);
            }
            string timeFinished = DateTime.Now.ToString("MM/dd/yyyy - h:mm:ss tt");

            Log log = new Log
            {
                LogName = logName,
                CounterName = perfCounter.CounterName,
                InstanceName = perfCounter.InstanceName,
                CategoryName = perfCounter.CategoryName,
                MachineName = perfCounter.MachineName,
                TimeStarted = timeStarted,
                TimeFinished = timeFinished,
                PerformanceData = string.Join(",", dataValues),
                UserID = currUser[0].UserID
            };              
            this.CreateLog(log);
            logIt.Add(new LogInfo
            {
                LogName = logName,
                CounterName = perfCounter.CounterName,
                InstanceName = perfCounter.InstanceName,
                CategoryName = perfCounter.CategoryName,
                MachineName = perfCounter.MachineName,
                TimeStarted = timeStarted,
                TimeFinished = timeFinished,
                PerformanceData = dataValues.ToList<string>()
            });
        }
        return logIt;
    }

这是 LogController.cs 中方法的控制器:

  [AcceptVerbs("GET", "POST")]
    public List<LogInfo> Log_Perf_Data(string machine_name, string category_name, string counter_name, string instance_name,
                                   string log_name, long? seconds, string live, string enforceQuery)
    {
        LogController.CheckUser();

        // POST api/log/post_data?machine_name=&category_name=&counter_name=&instance_name=&log_name=&seconds=
        if (machine_name != null && category_name != null && counter_name != null && log_name != null && seconds.HasValue && enforceQuery == null)
        {
            List<LogInfo> dataVal = logDB.LogTimedPerfData(machine_name, category_name, counter_name, instance_name,
                                   log_name, live, seconds);
            logDB.SaveChanges();
            return dataVal;

        }

        return new List<LogInfo>();
    }

更新:

所以,我更新了 hub 方法,现在它是

public void SendToClient(List<DataValueInfo> json)
{
    Clients.showValue(json);
}

在我的存储库方法中,我对其进行了更新,使其具有

var hubConnection = new HubConnection("http://localhost/PerfMon2");
hubConnection.Credentials = CredentialCache.DefaultNetworkCredentials;
var perfMon = hubConnection.CreateProxy("LiveHub");                    //            
perfMon.On("showValue", json => Console.WriteLine(json));
hubConnection.Start().Wait();

List<DataValueInfo> lol = new List<DataValueInfo>();
for (int i = 0; i < seconds; i++)
{
    data = "Value " + i + ": " + perfCounter.NextValue().ToString();
    dataValues.Add(data);
    lol.Add(new DataValueInfo
    {
        Value = perfCounter.NextValue().ToString()
    });
    perfMon.Invoke<List<DataValueInfo>>("SendToClient", lol);
    Thread.Sleep(1000);
}

仍然没有运气。是因为我使用的是不能在浏览器上使用的 Console.WriteLine 吗?如果不是这样,我能用什么?如前所述,Javascript 是不可能的,因为我没有使用视图。

4

1 回答 1

1

我认为您误解了一些 SignalR 基础知识,因为我Clients在您的集线器中没有看到任何呼叫,这意味着您没有广播任何内容。

您集线器上的公共方法(即您的 Send() 方法)现在非常无用,因为它只是返回您传递给它的数据。如果要从服务器广播到连接的客户端,则需要使用Clientshub 方法中的动态属性并在其上调用方法。

通读这些文档应该可以让您更好地了解它应该如何工作:https ://github.com/SignalR/SignalR/wiki/Hubs

于 2012-09-02T13:03:49.267 回答