1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
//------------------------------------------------------------------------------
// <copyright file="SessionPageStatePersister.cs" company="Microsoft">
// Copyright (c) Microsoft Corporation. All rights reserved.
// </copyright>
//------------------------------------------------------------------------------
namespace System.Web.UI {
using System.Collections;
using System.Collections.Specialized;
using System.IO;
using System.Text;
using System.Web.SessionState;
using System.Web.Configuration;
using System.Web.Security.Cryptography;
public class SessionPageStatePersister : PageStatePersister {
private const string _viewStateSessionKey = "__SESSIONVIEWSTATE";
private const string _viewStateQueueKey = "__VIEWSTATEQUEUE";
public SessionPageStatePersister(Page page) : base (page) {
HttpSessionState session = null;
try {
session = page.Session;
}
catch {
// ignore, throw if session is null.
}
if (session == null) {
throw new ArgumentException(SR.GetString(SR.SessionPageStatePersister_SessionMustBeEnabled));
}
}
public override void Load() {
NameValueCollection requestValueCollection = Page.RequestValueCollection;
if (requestValueCollection == null) {
return;
}
try {
string combinedSerializedStateString = Page.RequestViewStateString;
string persistedStateID = null;
bool controlStateInSession = false;
// SessionState will persist a Pair of <bool requiresControlStateInSession, string/pair>,
// where if requiresControlStateInSession is true, second will just be the sessionID, as
// we will store both control state and view state in session. Otherwise, we store just the
// view state in session and the pair will be <id, ControlState>
if (!String.IsNullOrEmpty(combinedSerializedStateString)) {
Pair combinedState = (Pair)Util.DeserializeWithAssert(StateFormatter2, combinedSerializedStateString, Purpose.WebForms_SessionPageStatePersister_ClientState);
// Check if we are storing control state in session as well
if ((bool)combinedState.First) {
// So the second is the persistedID
persistedStateID = (string)combinedState.Second;
controlStateInSession = true;
}
else {
// Second is <sessionID, ControlState>
Pair pair = (Pair)combinedState.Second;
persistedStateID = (string)pair.First;
ControlState = pair.Second;
}
}
if (persistedStateID != null) {
object sessionData = Page.Session[_viewStateSessionKey + persistedStateID];
if (controlStateInSession) {
Pair combinedState = sessionData as Pair;
if (combinedState != null) {
ViewState = combinedState.First;
ControlState = combinedState.Second;
}
}
else {
ViewState = sessionData;
}
}
}
catch (Exception e) {
// Setup the formatter for this exception, to make sure this message shows up
// in an error page as opposed to the inner-most exception's message.
HttpException newException = new HttpException(SR.GetString(SR.Invalid_ControlState), e);
newException.SetFormatter(new UseLastUnhandledErrorFormatter(newException));
throw newException;
}
}
/// <devdoc>
/// To be supplied.
/// </devdoc>
public override void Save() {
bool requiresControlStateInSession = false;
object clientData = null;
Triplet vsTrip = ViewState as Triplet;
// no session view state to store.
if ((ControlState != null) ||
((vsTrip == null || vsTrip.Second != null || vsTrip.Third != null) && ViewState != null)) {
HttpSessionState session = Page.Session;
string sessionViewStateID = Convert.ToString(DateTime.Now.Ticks, 16);
object state = null;
requiresControlStateInSession = Page.Request.Browser.RequiresControlStateInSession;
if (requiresControlStateInSession) {
// ClientState will just be sessionID
state = new Pair(ViewState, ControlState);
clientData = sessionViewStateID;
}
else {
// ClientState will be a <sessionID, ControlState>
state = ViewState;
clientData = new Pair(sessionViewStateID, ControlState);
}
string sessionKey = _viewStateSessionKey + sessionViewStateID;
session[sessionKey] = state;
Queue queue = session[_viewStateQueueKey] as Queue;
if (queue == null) {
queue = new Queue();
session[_viewStateQueueKey] = queue;
}
queue.Enqueue(sessionKey);
SessionPageStateSection cfg = RuntimeConfig.GetConfig(Page.Request.Context).SessionPageState;
int queueCount = queue.Count;
if (cfg != null && queueCount > cfg.HistorySize ||
cfg == null && queueCount > SessionPageStateSection.DefaultHistorySize) {
string oldSessionKey = (string)queue.Dequeue();
session.Remove(oldSessionKey);
}
}
if (clientData != null) {
Page.ClientState = Util.SerializeWithAssert(StateFormatter2, new Pair(requiresControlStateInSession, clientData), Purpose.WebForms_SessionPageStatePersister_ClientState);
}
}
}
}
|