API ответа переполнения стека - PullRequest
0 голосов
/ 15 января 2020

Я отправляю запрос POST на мой WebApi Asp. Net Core 3.0 и получаю сообщение об ошибке переполнения стека. Почему это?

Мой ответ терминала:

info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
      Request starting HTTP/2 POST https://localhost:5001/clients application/json 5
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
      Executing endpoint 'Cardapio.Controllers.ClientsController.Post (Cardapio)'
info: Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[3]
      Route matched with {action = "Post", controller = "Clients"}. Executing controller action with signature Microsoft.AspNetCore.Mvc.IActionResult Post(Cardapio.Models.Client) on controller Cardapio.Controllers.ClientsController (Cardapio).
Stack overflow.

Мой контроллер:

using System.Threading.Tasks;
using Cardapio.Models;
using Microsoft.AspNetCore.Mvc;

namespace Cardapio.Controllers
{
    [ApiController]
    [Route("clients")]
    public class ClientsController : Controller
    {
        [HttpPost]
        [Route("")]
        public IActionResult Post([FromBody]Client model)
        {
            if (!ModelState.IsValid)
                return BadRequest(ModelState);

            return Ok("Success");
        }
    }
}

Мой модель клиента:

using System;
using System.ComponentModel.DataAnnotations;

namespace Cardapio.Models
{
    public class Client
    {
        [Key]
        public int Id { get; set; }

        public string Ip { get; set; }

        public string Identification { get; set; }

        public string Secrets { get; set; }

        public DateTime CreatedAt { get { return this.CreatedAt; } set { this.CreatedAt = DateTime.Now; } }
    }
}

Это простой контроллер, в другом случае с доступом к базе данных с помощью Entity Framework нет проблем.

1 Ответ

5 голосов
/ 15 января 2020

Ваша модель - проблема, CreatedAt ссылается на себя, что приведет к бесконечному l oop попыток получить или установить значение.

Для реализации logi c требуется поле поддержки. позади геттеров и сеттеров.

Вот пример, который использует вспомогательное поле.

using System;
using System.ComponentModel.DataAnnotations;

namespace Cardapio.Models
{
    public class Client
    {
        private DateTime createdAt;

        [Key]
        public int Id { get; set; }

        public string Ip { get; set; }

        public string Identification { get; set; }

        public string Secrets { get; set; }

        public DateTime CreatedAt { get { return this.createdAt; } set { this.createdAt = DateTime.Now; } }
    }
}

Однако вы можете минимизировать это, назначив значение по умолчанию для CreatedAt, поскольку ничего особенного не происходит в операциях get или set. Если CreatedAt не ожидается возврата из API, вы также можете удалить set.

using System;
using System.ComponentModel.DataAnnotations;

namespace Cardapio.Models
{
    public class Client
    {
        [Key]
        public int Id { get; set; }

        public string Ip { get; set; }

        public string Identification { get; set; }

        public string Secrets { get; set; }

        public DateTime CreatedAt { get; set; } = DateTime.Now;
    }
}
...