Исключение StackOverflow - PullRequest
       5

Исключение StackOverflow

1 голос
/ 09 апреля 2011

Произошло необработанное исключение типа 'System.StackOverflowException' в mscorlib.dll

В событии page_load я звоню

       if (mySession.Current._isCustomer)
       {

            Response.Redirect("Products.aspx");
       }

mySession class:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace ShoppingCartWebApp
{
    public class mySession
    {
            // private constructor
    private mySession() {}

// Gets the current session.
public static mySession Current
{
  get
  {
    mySession session =
      (mySession)HttpContext.Current.Session["__MySession__"];
    if (session == null)
    {
      session = new mySession();
      HttpContext.Current.Session["__MySession__"] = session;
    }
    return session;
  }
}

// **** add your session properties here, e.g like this:
public string _Property1 { get; set; }
public DateTime _date { get; set; }
public String _loginId { get; set; }

public string _firstName { get; set; }
public string _userName { get; set; }
public string _role { get; set; }
public Boolean _isCustomer = false;
public Boolean _isAuth = false;
public Boolean _isGuest = true;
public ShoppingCart _cart = new ShoppingCart();

public ShoppingCart instance
{
    get
    {

        return _cart;
    }

    set
    {
        _cart = value;
    }
}



public void abandonSession()
{
   // _date = 
        _loginId = null;
        _firstName = null;
        _cart = null;
        _userName = null;
        _role = null;
        _isCustomer = false;
        _isAuth = false;
    }
    }
}

это дает исключение stackoverflow. почему?

Класс ShoppingCart:

public class ShoppingCart
{
    #region ListCart

    public List<CartItem> Items { get; private set; }

    public static SqlConnection conn = new SqlConnection(connStr.connString);
    #endregion

    #region CartSession

    public ShoppingCart cart;

    public ShoppingCart() 
    {

        if (mySession.Current._cart == null)
        {
            cart = new ShoppingCart();
            cart.Items = new List<CartItem>();

            if (mySession.Current._isCustomer)
                cart.Items = ShoppingCart.loadCart(mySession.Current._loginId);

            mySession.Current._cart = cart;
        }
        else
        {
            cart = mySession.Current._cart;
        }

    }
}

Ответы [ 3 ]

6 голосов
/ 09 апреля 2011

Эта строка кода вызывает бесконечный цикл и переполнение стека:

if (mySession.Current._isCustomer)
                cart.Items = ShoppingCart.loadCart(mySession.Current._loginId);

она инициализируется каждым экземпляром класса mysession.и использование родительского класса.

даже при использовании singleton mySession не может решить проблему.

при выполнении этого кода:

session = new mySession();

пытается инициализировать новый ShoppingCard .В карточке покупок запрашивается одноразовый экземпляр mysession.эта строка кода еще не выполнена:

HttpContext.Current.Session["__MySession__"] = session;

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

это означает переполнение стека!

youможно исправить так:

public static mySession Current
{
  get
  {
    mySession session =
      (mySession)HttpContext.Current.Session["__MySession__"];
    if (session == null)
    {
      session = new mySession();
      HttpContext.Current.Session["__MySession__"] = session;
      session._cart = new ShoppingCart(); //initialize your shoppoing car after adding variable to session !
    }
    return session;
  }
}

public ShoppingCart _cart;// = new ShoppingCart(); remove initialization

посмотрите мои комментарии в коде.

1 голос
/ 09 апреля 2011

Проблема возникает из-за связи между mySession и ShoppingCart.

mySession имеет переменную-член, определенную следующим образом:

public ShoppingCart _cart = new ShoppingCart();

Когда вызывается конструктор mySession, создается экземпляр ShoppingCart.Когда конструктор ShoppingCart выполняется, он вызывает статическое свойство mySession.Current.Поскольку конструктор ShoppingCart был вызван из этого же свойства (помните, мы все еще создаем экземпляр mySession в исходном статическом вызове), он продолжает повторяться таким образом до тех пор, пока не будет вызвано StackOverflowException1016 *

Чтобы это исправить, я предлагаю вам взглянуть на класс ShoppingCart.Во-первых, зачем ему нужен сам экземпляр как переменная-член?Во-вторых, если ShoppingCart необходимо знать информацию о содержимом mySession, ваша инкапсуляция неверна.Я предлагаю вам передать необходимую информацию в конструктор ShoppingCart, чтобы не перезванивать mySession.Current.

0 голосов
/ 09 апреля 2011

Учитывая ваш обновленный вопрос, я думаю, что если вы правильно следовали правилам именования .Net (как изложено в моем комментарии к вашему вопросу), вы сможете легко понять, в чем проблема. Я подозреваю, что ваш код вызова похож, и несоблюдение указаний скрывает то, что на самом деле происходит, от того, что, по вашему мнению, происходит.

В качестве первого шага я бы порекомендовал сделать эту очистку; это, вероятно, прояснит, где вы вызываете переполнение.

...