StackoverflowException при возврате списка <object> - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь вызвать вызов, чтобы получить список объектов и просто напечатать его содержимое.когда вызов сделан, ошибка 502.3 и ошибка возврата стека возникнут при обратном вызове.См. Код ниже

[HttpGet("[action]")]
    public async Task<List<Portfolio>> GetAllPortfolios()
    {
        var portfolios = await _portfolioService.GetAllPortfolios().ConfigureAwait(false);
        return portfolios;
    }

Я попытался вернуть пустой список, и он работал нормально со статусом 200.

Вот мой код для вызова сервера для получения данных

public async Task<List<Portfolio>> GetAllPortfolios()
    {
        List<Portfolio> PortfolioList = new List<Portfolio>();
        Portfolio portfolio;
        using (SqlConnection conn = new SqlConnection(Connection))
        {
            SqlCommand command = new SqlCommand();
            command.Connection = conn;
            command.CommandType = CommandType.StoredProcedure;
            command.CommandText = "USP_Get_All_Portfolios";
            conn.Open();
            SqlDataReader reader = await command.ExecuteReaderAsync().ConfigureAwait(false);

            //Fields to be populated
            string PortfolioName, Description, CreateID, UpdateID;

            while (await reader.ReadAsync().ConfigureAwait(false))
            {
                PortfolioName = reader["Portfolio_Name"].ToString();
                Description = reader["Long_Description"].ToString();
                CreateID = reader["Create_ID"].ToString();
                UpdateID = reader["Update_ID"].ToString();
                portfolio = new Portfolio(PortfolioName, Description, CreateID, UpdateID);
                PortfolioList.Add(portfolio);
            }
            reader.Close();
        }

        return PortfolioList;
    }

Код для моего PortfolioService

public class PortfolioService : IPortfolioService
{
    private readonly IPortfolioRepository _portfolioRepository;

    public PortfolioService(IPortfolioRepository portfolioRepository)
    {
        _portfolioRepository = portfolioRepository;
    }
    public async Task<bool> CreatePortfolio(Portfolio portfolio)
    {
        return await _portfolioRepository.CreatePortfolio(portfolio).ConfigureAwait(false);
    }

    public async Task<List<Portfolio>> GetAllPortfolios()
    {
        return await _portfolioRepository.GetAllPortfolios().ConfigureAwait(false);
    }
}

Код для моего класса портфолио

public class Portfolio
{
    private string mPortfolioName;
    private string mDescription;
    private string mCreateID;
    private string mUpdateID;

    public string PortfolioName
    {
        get { return mPortfolioName; }
        set { mPortfolioName = value; }
    }

    public string Description
    {
        get { return Description; }
        set { mDescription = value; }
    }

    public string CreateID
    {
        get { return mCreateID; }
        set { mCreateID = value; }
    }

    public string UpdateID
    {
        get { return UpdateID; }
        set { mUpdateID = value; }
    }

    public Portfolio(string portfolioName, string description, string createID, string updateID)
    {
        mPortfolioName = portfolioName;
        mDescription = description;
        mCreateID = createID;
        mUpdateID = updateID;
    }
}

1 Ответ

2 голосов
/ 05 июля 2019

Вам необходимо вернуть mUpdateId в get для Portfolio.UpdateId и mDescription из Portfolio.Description.

То, что вы сейчас делаете, вызывает метод get для Portfolio.UpdateId в методе get.

, который вызывает get.

, который вызывает get.

и т. Д. ...

Когдавы возвращаетесь из контроллера ASP.NET сериализует этот класс для вас.Когда он сериализуется, он пытается получить значение UpdateId, и это вызывает бесконечную рекурсию, которая вызывает переполнение стека.

Кстати, любая причина не отбрасывать приватные поля в пользу Автоматически реализованные свойства .

public class Portfolio
{
    public string PortfolioName { get; set; }
    public string Description { get; set; }
    public string CreateID { get; set; }
    public string UpdateID { get; set; }

    public Portfolio(string portfolioName, string description, string createID, string updateID)
    {
        PortfolioName = portfolioName;
        Description = description;
        CreateID = createID;
        UpdateID = updateID;
    }
}

Это может избавить вас от простой опечатки, подобной этой в будущем:).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...