如何解决无法序列化会话状态。在' StateServer'和' SQLServer'错误?

时间:2016-07-24 09:53:42

标签: sql-server asp.net-mvc serialization session-state session-storage

我想将会话状态配置为保存在SQL Server数据库中,但在配置时我遇到以下错误:

  

无法序列化会话状态。在' StateServer'和' SQLServer'在模式下,ASP.NET将序列化会话状态对象,因此不允许使用不可序列化的对象或MarshalByRef对象。如果自定义会话状态存储在'自定义'中进行类似的序列化,则适用相同的限制。模式。

虽然错误是自我解释的,但它需要对象进行序列化。我将要在会话状态中保存的类设置为[Serializable],但即使我收到如下错误:

[Serializable()]
    public class Cart
    {
        private List<CartLine> lineCollection = new List<CartLine>();
        public void AddItem(Product product, int quantity)
        {
            CartLine line = lineCollection
                .Where(p => p.Product.ProductID == product.ProductID)
                .FirstOrDefault();
            if (line == null)
            {
                lineCollection.Add(new CartLine { Product = product, Quantity = quantity });
            }
            else
            {
                line.Quantity += quantity;
            }
        }
        public void RemoveLine(Product product)
        {
            lineCollection.RemoveAll(l => l.Product.ProductID == product.ProductID);
        }
        public decimal ComputeTotalValue()
        {
            return lineCollection.Sum(e => e.Product.ProductPrice * e.Quantity);
        }
        public void Clear()
        {
            lineCollection.Clear();
        }
        public IEnumerable<CartLine> Lines
        {
            get { return lineCollection; }
        }
        public class CartLine
        {
            public Product Product { get; set; }
            public int Quantity { get; set; }
        }
    }

我已经实现了一个接口IModelBinder,第二个参数ControllerContext有一个HttpContext属性,而该属性又有Session属性,可以让我设置和获取数据。我可以通过从会话数据中读取值来获取与用户会话相关联的Cart对象,如果没有像这样的那样,则创建一个Cart:

namespace Ozhay.Web.UI.Infrastructure.Binders
{
    public class CartModelBinder : IModelBinder
    {
        private const string sessionKey = "Cart";

        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            Cart cart = null;
            if (controllerContext.HttpContext.Session != null)
            {
                cart = (Cart)controllerContext.HttpContext.Session[sessionKey];
            }
            if (cart == null)
            {
                cart = new Cart();
                if (controllerContext.HttpContext.Session != null)
                    controllerContext.HttpContext.Session[sessionKey] = cart;
            }
            return cart;
        }
    }
}

到目前为止还有任何想法如何处理它? Edit1:以下是web.config文件中sessionState的配置。

<system.web>
    <authentication mode="None" />
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
    <sessionState mode="SQLServer" allowCustomSqlDatabase="true"
      sqlConnectionString="Data Source = .; Initial Catalog = Hosay; User ID = sa, password = ******; Integrated Security=SSPI" />
  </system.web>

0 个答案:

没有答案