Из-за того, что сеть не имеет состояния, сеансы также являются чрезвычайно полезным способом сохранения объектов в запросах путем их сериализации и сохранения в сеансе.
Идеальным вариантом использования этого может быть, если вам нужно получить доступ к регулярной информации в вашем приложении, чтобы сохранить дополнительные вызовы базы данных по каждому запросу, эти данные могут быть сохранены в объекте и десериализованы по каждому запросу, например:
Наш многоразовый сериализуемый объект:
[Serializable]
public class UserProfileSessionData
{
public int UserId { get; set; }
public string EmailAddress { get; set; }
public string FullName { get; set; }
}
Пример использования:
public class LoginController : Controller {
[HttpPost]
public ActionResult Login(LoginModel model)
{
if (ModelState.IsValid)
{
var profileData = new UserProfileSessionData {
UserId = model.UserId,
EmailAddress = model.EmailAddress,
FullName = model.FullName
}
this.Session["UserProfile"] = profileData;
}
}
public ActionResult LoggedInStatusMessage()
{
var profileData = this.Session["UserProfile"] as UserProfileSessionData;
/* From here you could output profileData.FullName to a view and
save yourself unnecessary database calls */
}
}
После того, как этот объект был сериализован, мы можем использовать его во всех контроллерах без необходимости его создания или повторного запроса в базе данных содержащихся в нем данных.
Внедрите объект сеанса с помощью инъекции зависимостей
В идеальном мире вы должны ` ` программировать интерфейс, а не реализацию '' и вводить свой сериализуемый объект сеанса в свой контроллер, используя выбранный контейнер Inversion of Control, например (в этом примере используется StructureMap, поскольку это тот, с которым я наиболее знаком ).
public class WebsiteRegistry : Registry
{
public WebsiteRegistry()
{
this.For<IUserProfileSessionData>().HybridHttpOrThreadLocalScoped().Use(() => GetUserProfileFromSession());
}
public static IUserProfileSessionData GetUserProfileFromSession()
{
var session = HttpContext.Current.Session;
if (session["UserProfile"] != null)
{
return session["UserProfile"] as IUserProfileSessionData;
}
/* Create new empty session object */
session["UserProfile"] = new UserProfileSessionData();
return session["UserProfile"] as IUserProfileSessionData;
}
}
Затем вы должны зарегистрировать это в своем Global.asax.cs
файле.
Для тех, кто не знаком с инъекцией объектов сеанса, вы можете найти более подробное сообщение в блоге по этой теме здесь .
Слово предупреждения:
Стоит отметить, что количество сеансов должно быть сведено к минимуму, так как большие сеансы могут вызвать проблемы с производительностью.
Также рекомендуется не хранить в них конфиденциальные данные (пароли и т. Д.).