/// <summary> /// Метод сохраняющий ViewState в базу данных и размещающий его ключ на странице. /// </summary> public override void Save() { // Если включен постринченый режим применения проверяем помечена страница или нет if (_viewStateElement.ApplayByCustomPageOnly && !(Page is IStsStatePersistedPage)) { base.Save(); return; } var vs = new StsViewState { Id = Guid.NewGuid(), Data = Serialize(), Timeout = _viewStateElement.Timeout }; SaveToSql(vs); if (_viewStateElement.UseCacheForSqlMode) { //SaveToCache(vs, VIEWSTATE_CACHEKEY_PREFIX + vs.Id); throw new NotImplementedException("Механизм кэширования PageState еще не реализован."); } // Заменяем реальный ViewState на GUID сохраненного ViewState = vs.Id; ControlState = ""; // Базовый класс размещает подмененный ViewState на странице base.Save(); }
/// <summary> /// Метод загружающий ViewState из базы данных и размещающий его на странице. /// </summary> public override void Load() { // Load Whatever is there in the __VIEWSTATE hidden variables. base.Load(); // Если включен постринченый режим применения проверяем помечена страница или нет try { if (_viewStateElement.ApplayByCustomPageOnly && !(Page is IStsStatePersistedPage)) { return; } string currentViewState = ViewState.ToString(); // Проверяем что ViewState это GUID, для этого достаточно проверить, // что количество знаков равно 36 if (currentViewState.Length == 36) { StsViewState vs = null; if (_viewStateElement.UseCacheForSqlMode) { //string cacheKey = VIEWSTATE_CACHEKEY_PREFIX + base.ViewState; //try { vs = GetFromCache(cacheKey); } //catch { } throw new NotImplementedException("Механизм кэширования PageState еще не реализован."); } if (vs == null) { vs = LoadFromSql(currentViewState); } if (_viewStateElement.UseCompression) { throw new NotImplementedException("Механизм сжатия PageState еще не реализован."); } Deserialize(vs.Data); } } catch (Exception e) { if (!Globals.Settings.ExceptionHandling.SendExceptionEmails) { throw; } QDSearch.Helpers.ExceptionHandling.SendErrorMessage( new ApplicationException( "Ошибка загрузки состояния страницы, пользователь перенаправлен на начальную страницу.", e)); //QDSearch.Helpers.Web.ShowMessageWithRedirect(Page, @"К сожалению, страница устарела. Для продолжения работы страница будет перезагружена.", Page.ResolveClientUrl(@"~/")); Page.Response.Redirect(Page.ResolveClientUrl(@"~/"), true); } }
/// <summary> /// Сохраняет ViewState в БД /// </summary> /// <param name="vs"></param> protected void SaveToSql(StsViewState vs) { if (vs != null && !string.IsNullOrEmpty(vs.Data)) { using (var connection = new SqlConnection(_viewStateElement.PageStateDbConnectionString)) { using (var command = connection.CreateCommand()) { command.Connection = connection; command.CommandType = CommandType.StoredProcedure; if (vs.Data.Count() > 4000) { command.CommandText = @"dbo.InsertPageStateItemLong"; command.Parameters.Add(new SqlParameter("@pageStateItemLong", SqlDbType.NVarChar) { Value = vs.Data }); } else { command.CommandText = @"dbo.InsertPageStateItemShort"; command.Parameters.Add(new SqlParameter("@pageStateItemShort", SqlDbType.NVarChar) { Value = vs.Data }); } command.Parameters.Add(new SqlParameter("@pageStateId", SqlDbType.UniqueIdentifier) { Value = vs.Id }); command.Parameters.Add(new SqlParameter("@timeoutMin", SqlDbType.Int) { Value = vs.Timeout }); command.Connection.Open(); command.ExecuteNonQuery(); } } } }
/// <summary> /// Загрузка ViewState из БД /// </summary> /// <param name="vsId">Идентификатор состояния страницы</param> /// <returns></returns> /// <exception cref="ApplicationException"></exception> protected StsViewState LoadFromSql(string vsId) { if (string.IsNullOrEmpty(vsId)) { return(null); } using (var connection = new SqlConnection(_viewStateElement.PageStateDbConnectionString)) { if (connection.State == ConnectionState.Closed) { connection.Open(); } var vs = new StsViewState();; try { using (var command = new SqlCommand("", connection)) { command.CommandType = CommandType.StoredProcedure; command.CommandText = "dbo.SelectPageStateItem"; command.Parameters.AddWithValue("@pageStateId", vsId); using (SqlDataReader dr = command.ExecuteReader()) { while (dr.Read()) { vs.Id = (Guid)dr["PageStateId"]; vs.Data = dr["PageStateItem"].ToString(); vs.Timeout = Convert.ToUInt32(dr["TimeoutMin"]); } } } } catch (Exception e) { throw new ApplicationException(String.Format(@"Ошибка загрузки состояния страницы для Id={0}, Data={1}, Timeout={2}, __pingStamp={3}", vs.Id, vs.Data, vs.Timeout, Page.Request.Params.AllKeys.Contains("__pingStamp") ? Page.Request["__pingStamp"].ToString(CultureInfo.InvariantCulture) : "не найден", e)); } return(vs); } }