我想将会话状态配置为保存在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>