@evgemiil

Не выполняется метод статистики json?

Помогите пожалуйста разобраться, не прошу мне сделать, прошу разобраться выяснить проблему понять и решить. Есть MVC проект, проекта игры, вот код файла HomeController
using Newtonsoft.Json;
using System.Web.Mvc;
using WebApplication.Models;
using XO;


namespace WebApplication.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View(new StatisticsModels());
        }

        public ActionResult About()
        {
            ViewBag.Message = "Your application description page.";

            return View();
        }

        public ActionResult Contact()
        {
            ViewBag.Message = "Your contact page.";

            return View();
        }

         [HttpPost]
        public bool SaveGameInfo([System.Web.Http.FromBody]dynamic stat)
        {
            var newStat = JsonConvert.DeserializeObject<Statistcs>(stat.StatisticsList);
            return StatisticsModels.AddStatistics(newStat);
        }

        [HttpGet]
        public string GetGameInfo()
        {
            return JsonConvert.SerializeObject(new StatisticsModels().StatisticsList);
        }

    }
}

вот код StatisticsModels
using Newtonsoft.Json;
using System.Collections.Generic;
using System.IO;
using XO;
using System.Data;
using System.Data.SqlClient;

namespace WebApplication.Models
{
    public class StatisticsModels
    {
        public List<Statistcs> StatisticsList { get; set; }

        public StatisticsModels()
        {
            var jsonData = File.ReadAllText(@"C:\Users\EvgenieL\Source\Repos\XO\XO\XO\bin\Debug\stats.json");
            StatisticsList = JsonConvert.DeserializeObject<List<Statistcs>>(jsonData);

        }

        public static bool AddStatistics(Statistcs stat)
        {
            //var conn = new SqlConnection(@"Data Source=localhost;Initial Catalog=XO;Integrated Security=true");
            //var command = new SqlCommand();
            //command.Connection = conn;
            //command.CommandType = CommandType.Text;
            //command.CommandText = $"INSERT INTO Statistic(Date, Result, StepCounter, UserFirst) VALUES('{stat.Date}', '{stat.Result}', {stat.StepCounter}, '{stat.UserFirst}')";

            //try
            //{
            //    conn.Open();
            //    command.ExecuteNonQuery();
            //}
            //catch
            //{
            //    return false;
            //}
            //finally
            //{
            //    conn.Close();
            //}

            //return true;

            try
            {
                var filePath = "stats.json";

                var jsonData = File.ReadAllText(filePath);

                var statisticsList = JsonConvert.DeserializeObject<List<Statistcs>>(jsonData)
                                        ?? new List<Statistcs>();

                statisticsList.Add(stat);

                jsonData = JsonConvert.SerializeObject(statisticsList);
                File.WriteAllText(filePath, jsonData);
            }
            catch
            {
                return false;
            }
            return true;
        }
    }
}


Проблема в том что метод AddStatistics не выполняется, смотрел по точкам останова, не смог решить, не пойму почему не выполняется. Чтобы было понятнее вот ссылка в гитхаб https://github.com/evgeniel/XO
  • Вопрос задан
  • 202 просмотра
Пригласить эксперта
Ответы на вопрос 2
EreminD
@EreminD
Кое-что умею
  1. В newStat что-нибудь пишется в итоге?
  2. метод AddStatistics не выполняется
    - что значит? Не вызывается? Проходит через него и нет результата? Вываливается ошибка? Выходит где-нибудь посредине?
  3. В методе AddStatistics, в statisticsList записывается список из файла?
  4. Сделайте временно внятный обработчик. Посмотрите stack trace, если вываливается исключение
    catch
                {
                    return false;
                }


Ответ написан
@dmitryKovalskiy
программист средней руки
var jsonData = File.ReadAllText(@"C:\Users\EvgenieL\Source\Repos\XO\XO\XO\bin\Debug\stats.json");
-Очень плохая, идея. Просто нереально плохой хард-код.

1)В блок catch добавить логирование(какое угодно, лучше использовать готовое решение вроде log4net или Nlog).
2)
var filePath = "stats.json";
var jsonData = File.ReadAllText(filePath);

Внимание вопрос - что и откуда вы здесь прочитаете?

У вас очень плохой слой бизнес-логики, который будет работать в приторно белом сценарии, но в случае отклонения от этого сценария - будет ошибка, которую вы никогда не отловите.
Прописывайте сценарий когда не получилось десериализовать,
когда не получилось сохранить.
Хотя бы разные исключения ловите, а не глушите сразу все, делая вид что ошибки это часть вашей бизнес-логики.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы