大部分人用的存取到硬盘我觉得这个效率并不好,况且。NET本身就有SESSION那么为什么不能用SESSION
解决方案 »
- 挂马
- .NET处理请求后返回XML,为什么返回的XML带有处理页的HTML代码,如何处理?
- 关于charindex()的问题
- .net 初级书 哪本好啊 ,0基础的 。。。拜托大家推荐下
- 正则表达式\s\S的简写怎么写
- 定义的字符串是一个正则,结果提示我错误
- ASP.NET高级开发(6)群,群号:22068906,北京的朋友赶紧加了。群口号:代码共享,技术共享.四海为家.皆为朋友..
- 为何CSDN提供的范例无法下载
- 问题:DataTable.Select 可以返回过虑条件中,满足其中一个条件的一个值么?
- 如果我有多个grid,怎么用同一个函数来控制所有的操作阿?
- 问下关于声明静态的问题!
- 聊天室
第一,服务器的关键就是很低的硬件配置可以给上千人使用。因而,只有瞬间之中的状态数据才在内存中驻留。如果你放入Session,服务器的用户承载能力是少下降100倍。第二,如果做过商品化网站应用都知道,Session是会自己“消失”的。网站服务器是什么概念?很简单,当我们浏览这个页面的时候,可能csdn服务器已经重新启动了,但是我们的下一个操作根本不受影响,这就是互联网上的应用的可靠性。如果依赖于Session、Application,那么就相当于把缓存当作可靠存储,基本的应用逻辑问题还没有解决。
我不明天这句话是啥意思
后半句话就不去评说了。单这前半句,请怎么配置能保证商品化的web服务器上的web应用程序不会被iis重启?!
请大侠指点下“去掉ASP。NET页面中的VIEWSTATE非存硬盘方法”是什么意思
有什么好处 怎么个用法啊?
谢谢
我觉得这就有点狡辩了吧。你知道基于状态服务器或者SQL数据库的保存都要序列化和反序列化吗?请问你这个程序是否在“将Session保存到其它机器上去”的环境下做过一定量的测试?能够稍微描述一下进行这个测试的部署和开发你遇到了哪些入门书上所没有讲明的要点?例如我就讲出了“序列化反序列化”,但是我不告诉你何时、如何序列化,因为你用不到,你没有实际去做到那里。
就是去掉这玩意
去掉这玩意
不论你是否序列化反序列化,当Session保存到“外部机器上”(如你所说)的时候需要再一次序列化反序列化,我是这个意思!我是提醒你注意为什么会“再一次”序列化、反序列化。你宁可把它序列化然后保存到“外部机器上”,而不愿“保存在硬盘上”,因此我觉得很奇怪的思路,希望你说明为什么保存到外部机器上比保存在本地好。也许你会说:我只是说“有可能”啊?!我并没有认真说必须保存到外部机器上啊!我知道保存在外部机器上相比本地机器又慢又不可靠的!那么这就又绕回来了。我说的是谁都知道所谓的“Session丢失”并不是一种新鲜玩意,你为什么又不考虑可靠地保存在本地,又不考虑可靠地保存在外部机器呢?!
我其实只是不想离开你的程序本身。我指出你没有考虑到Session的所谓普遍地在生产服务器上易丢失问题,你就立刻转移说“你不知道Session可以保存到外部机器吗?”。实际上,序列化之后保存到外部机器上难道比异步写到本地磁盘“这个效率并不好”?我是因为觉得你只是勉强找一个说法,你自己想一想也会知道答案,所以我不用去分析什么。
是呀,清楚地表明如何保持ViewState的持久化策略,如果借助于外部服务器也要清楚地表明必须以使用外部服务器为前提,程序就完整了。
不是说必要的时候禁用viewstate就可以了吗?
其实我还是不清楚viewstate的作用。
{ #region Methods /// <summary>
/// Gets the Persister for SQL Server.
/// </summary>
/// <returns>
/// An SqlPageStatePersister.
/// </returns>
public override PageStatePersister GetStatePersister()
{
SqlPageStatePersister persister = new SqlPageStatePersister(this.Page); return persister;
} #endregion Methods }
public class SqlPageStatePersister : PageStatePersister
{ #region Fields private const string _hiddenFieldID = "__VIEWSTATEKEY"; #endregion Fields #region Constructors /// <summary>
/// Initializes a new instance of the SqlPageStatePersister class.
/// </summary>
/// <param name="page">
/// The page that provides the state to persist.
/// </param>
public SqlPageStatePersister(Page page) : base(page)
{
} #endregion Constructors #region Properties /// <summary>
/// Gets the connection string to the database that provides stored state.
/// </summary>
public string ConnectionString
{
get
{
string connectionString = null; ConnectionStringSettings settings =
ConfigurationManager.ConnectionStrings["SqlPageStatePersisterConnectionString"]; if (settings != null)
{
connectionString = settings.ConnectionString;
} return connectionString;
}
} #endregion Properties #region Methods /// <summary>
/// Loads state from SQL Server.
/// </summary>
public override void Load()
{
string key = this.Page.Request.Form[_hiddenFieldID]; if (!string.IsNullOrEmpty(key))
{
using (SqlConnection connection = new SqlConnection(this.ConnectionString))
{
SqlCommand command = new SqlCommand("GetWebClientPageState", connection);
command.CommandType = System.Data.CommandType.StoredProcedure; command.Parameters.Add("@StateKey", System.Data.SqlDbType.UniqueIdentifier);
command.Parameters["@StateKey"].Value = new Guid(key); connection.Open(); object rawState = command.ExecuteScalar(); connection.Close(); if ((rawState != null) && (rawState != DBNull.Value))
{
string stateText = Convert.ToString(rawState); Pair statePair = this.StateFormatter.Deserialize(stateText) as Pair; if (statePair != null)
{
this.ViewState = statePair.First;
this.ControlState = statePair.Second;
}
}
}
}
} /// <summary>
/// Saves state to SQL Server.
/// </summary>
public override void Save()
{
if ((this.ViewState != null) || (this.ControlState != null))
{
Guid stateKey = Guid.NewGuid();
string key = this.Page.Request.Form[_hiddenFieldID]; if (!string.IsNullOrEmpty(key))
{
stateKey = new Guid(key);
}
Pair statePair = new Pair(this.ViewState, this.ControlState); string stateText = this.StateFormatter.Serialize(statePair); using (SqlConnection connection = new SqlConnection(this.ConnectionString))
{
SqlCommand command = new SqlCommand("SetWebClientPageState", connection);
command.CommandType = System.Data.CommandType.StoredProcedure; command.Parameters.Add("@StateKey", System.Data.SqlDbType.UniqueIdentifier);
command.Parameters["@StateKey"].Value = stateKey; command.Parameters.Add("@State", System.Data.SqlDbType.Text);
command.Parameters["@State"].Value = stateText; connection.Open(); command.ExecuteNonQuery(); connection.Close();
} this.Page.ClientScript.RegisterHiddenField(_hiddenFieldID, stateKey.ToString());
}
} #endregion Methods }
BEGINPRINT 'Creating Table WebClientPageState'CREATE TABLE WebClientPageState
(
Id BIGINT IDENTITY(1, 1) NOT NULL,
StateKey UNIQUEIDENTIFIER NOT NULL,
State TEXT NULL,
DateSaved DATETIME NOT NULL DEFAULT (getdate())
)CREATE INDEX IX_PageStateStateKey
ON WebClientPageState(StateKey)CREATE INDEX IX_PageStateDateSaved
ON WebClientPageState(DateSaved)
ENDGOIF EXISTS (SELECT * FROM dbo.sysobjects WHERE ID = OBJECT_ID(N'SetWebClientPageState') AND XType = 'P')
BEGIN
PRINT 'Dropping Procedure SetWebClientPageState' DROP PROCEDURE SetWebClientPageState
END
GOPRINT 'Creating Procedure SetWebClientPageState'
GOCREATE PROCEDURE SetWebClientPageState
@StateKey UNIQUEIDENTIFIER,
@State TEXT
ASIF EXISTS (SELECT 1 FROM WebClientPageState WHERE StateKey = @StateKey)
BEGIN
UPDATE WebClientPageState
SET State = @State,
DateSaved = GETDATE()
WHERE StateKey = @StateKey
END
ELSE
BEGIN
INSERT INTO WebClientPageState
(
StateKey,
State,
DateSaved
)
VALUES
(
@StateKey,
@State,
GETDATE()
)
ENDGO
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE ID = OBJECT_ID(N'RemoveExpiredWebClientPageState') AND XType = 'P')
BEGIN
PRINT 'Dropping Procedure RemoveExpiredWebClientPageState' DROP PROCEDURE RemoveExpiredWebClientPageState
END
GOPRINT 'Creating Procedure RemoveExpiredWebClientPageState'
GOCREATE PROCEDURE RemoveExpiredWebClientPageState
ASDECLARE @ExpirationMinutes INT
DECLARE @ElapsedDate DATETIMESET @ExpirationMinutes = 60SET @ElapsedDate = DATEADD(minute, @ExpirationMinutes * -1, GETDATE())PRINT @ElapsedDateDELETE FROM WebClientPageState
WHERE DateSaved < @ElapsedDateGOIF EXISTS (SELECT * FROM dbo.sysobjects WHERE ID = OBJECT_ID(N'GetWebClientPageState') AND XType = 'P')
BEGIN
PRINT 'Dropping Procedure GetWebClientPageState' DROP PROCEDURE GetWebClientPageState
END
GOPRINT 'Creating Procedure GetWebClientPageState'
GOCREATE PROCEDURE GetWebClientPageState
@StateKey UNIQUEIDENTIFIER
ASSELECT State
FROM WebClientPageState
WHERE StateKey = @StateKeyGO2.0 ADAPTER方式
这下没毛病了吧!这不是我写的