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;
        }
    }
}

SignalR 呼び出しを含む LogDBRepository.cs のメソッドを次に示します。

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>();
    }

アップデート:

それで、ハブメソッドを更新して今になりました

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() メソッド) は、渡したデータを返すだけなので、現時点ではほとんど役に立ちません。サーバーから接続されたクライアントにブロードキャストする場合Clientsは、ハブ メソッドで動的プロパティを使用し、そのメソッドを呼び出す必要があります。

これらのドキュメントを読むと、これがどのように機能するかをよりよく理解できるはずです: https://github.com/SignalR/SignalR/wiki/Hubs

于 2012-09-02T13:03:49.267 に答える