理解Session State模式+ASP.NET SESSION丢失FAQ

作者:Patrick Y. Ng
原文地址:http://forums.asp.net/7504/ShowPost.aspx
译者:Tony Qu (来自BluePrint翻译团队)

原文最后一次更新:2004年9月21日

本文被分成两部分:
1.“理解Session State模式”——帮助你理解三种Session State的不同之处
2. FAQ

1.理解Session State模式

存储位置
InProc:session在服务器中以活动对象方式存储(aspnet_wp.exe)

StateServer: session被序列化并保存在单独的aspnet_state.exe的内存中。StateServer能够运行在另一台服务器上

SQLServer: session被序列化并保存在SQL Server中

性能:
InProc:最快,但是session数据越多,web服务器上消耗的内存也越多,它可能影响性能。

StateServer:当存储基本类型(如string,integer等)数据时,在同一个测试环境中它比InProc慢15%。如果你存储大量对象,序列化和反序列化可能影响到性能

SQLServer:当存储基本类型(如string,integer等)数据时,在同一个测试环境中它比InProc慢25%。它也有与StateServer一样的序列化性能问题。

关于Out-of-Proc(OOP,非InProc)模式的性能提示
如果你使用OOP模式(即StateServer或SQLServer),session state中的序列化和反序列化对象将成为你的主要性能消耗之一。对于基本类型,ASP.NET通过一种内部优化方法来完成序列化和反序列化。(基本类型包括所有的数字类型(如Int, Byte, Decimal,String, DateTime, TimeSpan, Guid, IntPtr和UIntPtr等))

如果你有一个session变量(如一个ArrayList对象),且它不是一个基本类型,ASP.NET将使用BinaryFormatter来进行序列化和反序列化,那可能会相对慢一些。

所以出于性能考虑,最好使用上面列出的基本类型来存储所有的session state数据。例如,如果你需要存储两个东西,名字和地址,在session state中你既可以(方法a)使用两个string session变量来存储它们,也可以(方法b)创建一个内含两个string的类来保存它们,然后把这个类对象保存在一个session变量中。出于性能考虑,你应该选择方法a。

为了进一步理解这个主题,请看FAQ中的一个问题:“序列化和反序列化如何在SqlServer和StateServer模式下工作”

健壮性
InProc:如果工作者进程(aspnet_wp.exe)进行资源回收或者应用程序域(appdomain)重启动,session state就会丢失。这是因为session state是保存在一个应用程序域的内存空间中的。对配置文件(如web.config和machine.config)的修改或者bin目录的任何改变(例如在你使用VS编译应用程序后产生了一个新的dll)都可能引起重启动,详细请见KB324772。在1.0中,也有一个bug可能引起工作者进程重启动,但这个bug在1.1中已经修复,见KB321792。

如果你使用的是IIS6.0,你可以在IIS Manager中找到Application Pools/DefaultAppPool,其中可以看到回收(Recycling)选项卡与性能(Performace)选项卡中是否有引起IIS工作者进程(w3svc.exe)停止工作的参数。

更多有关应用程序资源回收的内容,可以看我的另一篇FAQ:
http://www.asp.net/Forums/ShowPost.aspx?tabindex=1&PostID=232621

StateServer:解决了InProc模式的session state丢失问题。允许一个webfarm在中央服务器中存储session。只能在State Server上出现失败。

SQLServer:与StateServer相似。session state的数据在SQL Server重启后仍然保留着,你也可以按照KB311209的步骤使用SQL server failover cluster

警告
InProc:它不能在web garden模式下工作,因为在这个模式下会有多个aspnet_wp.exe在同一台机器上运行。建议在使用web garden使切换到State Server或SQL Server。仅在InProc模式下支持Session_End事件。

StateServer
– 在web farm中,请确认在所有的web服务器上有相同的<machineKey>。KB313091描述了如何设置它。
– 请确保你的对象是可序列化的。详见KB312112
– 为了在web farm中的不同web服务器上维护session state,IIS Metabase中的网站应用程序路径(如LMW3SVC2)应该在所有的服务器上保持一致(大小写敏感)。详见KB325056

SQLServer
– 在1.0中有一个bug,如果你在连接字符串中指定integrity security(如"trusted_connection=true"或 "integrated security=sspi"),且你打开了asp.net的身份模拟,它将不会工作。这个问题在KB324479中有描述,不幸的是这份文档中的描述和原因部分是错误的。不过已经有一个QFE fix对它作了修复,这个fix将包含在1.0 sp3中。这个问题在1.1中已经修复了。
– 请确认你的对象是可序列化的,否则你的请求可能被挂住,详见KB312112。SQLServer模式的挂起问题已经在1.1中修复,KB324479的QFE fix也修复了这个问题。1.0 sp3也对这个问题作了修复。
– 为了在web farm中的不同web服务器上维护session state,IIS Metabase中的网站应用程序路径(如LMW3SVC2)应该在所有的服务器上保持一致(大小写敏感)。详见KB325056

其他资源
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/aspnetsessionstate.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/CachingArchch2.asp
http://www.411asp.net/home/tutorial/specific/web/sessions

2. FAQ问题列表
Q: session state在部分浏览器上工作,而在其他一些上不工作。为什么呢?
Q: 在InProc模式中,为什么我有时会丢失所有的session?
Q: session state在一些web服务器上工作,但是在其他服务器上不工作。
Q: 为什么session state不可用?
Q: 为什么session_end没有触发?
Q: 使用InProc模式时,为什么我的session变量频繁丢失?
Q: 在session超时或删除之后,为什么SessionID保持不变
Q: 为什么SessionID每一次请求都会改变
Q: Session.Abandon()和Session.Clear()有什么区别
Q: session的Timeout属性是一个滑动超时值吗?
Q: 我可以在ASP.NET和ASP之间共享session吗?
Q: 我可以在web应用程序(例如虚拟目录或者IIS的应用程序)间共享session state吗?
Q: 在session state中可以存储哪些类型的对象?
Q: 为什么我的请求在切换到SQLServer模式之后挂住了?
Q: 为什么Response.Redirect和Server.Transfer在Session_End中不工作?
Q: 在Session_End中,我可以获得一个有效的HttpSessionState对象和HttpContext对象吗?
Q: 在web service中如何使用session?
Q:我正在写一个HttpHandler,为什么session stae不工作?
Q: 我正在使用web farm,并且每当我重定向到其他服务器时,session state就会丢失?
Q: 如果使用cookieless,我该如何从一个HTTP页面重定向到一个HTTPS页面?
Q: session state有没有一个锁机制来安排对session的访问顺序?
Q: 我该如何检测一个session过期,然后重定向到另一个页面
Q: 在Session_End中,我尝试使用SQL做一些清理工作,但是失败了,请问为什么?
Q: 我使用的是SQLServer模式,为什么我的session不会过期
Q: 我有一个以htm为扩展名的frameset页面,并且我发觉其中包含的每个帧在第一次请求时都有一个不同的SessionID,这是为什么?
Q: 我将EnableSessionState设置为ReadOnly,但是在InProc模式下,我仍然可以修改session,为什么?
Q: 我将cookieless设置为true,在Redirect之后session变量丢失了,为什么?
Q: 将cookieless设置为true有哪些缺点
Q: 在InProc模式下,我用编程方式改变了session的超时时间,它触发了Sessio
n_End,为什么?
Q: 在SQLServer模式下,我可以把session state保存在除tempdb之外的数据库中吗?
Q: 如何防止将未加密的字符串放在我的连接字符串汇总?
Q: 在使用SQLServer模式时,我需要怎样的SQL权限?
Q: 我可以自己写定制的session state模式吗?
Q: 在SQLServer或StateServer模式下,序列化和反序列化如何工作?
Q: 我该如何让我的state server更安全?
Q: 我能否可以使用非global.asax中的处理程序来订阅SessionStateModule.End事件?
Q: 不同的应用程序可以把他们的session state保存在同一个SQL Server上的不同数据库中吗?

Q: session state在部分浏览器上工作,而在其他一些上不工作。为什么呢?
A: 估计你没有使用cookieless,你必须保证你的浏览器支持cookie。请参考这份KB:http://support.microsoft.com/default.aspx?scid=kb;EN-US;q316112

Q: 在InProc模式中,为什么我有时会丢失所有的session?
A: 请见理解session state模式的健壮性部分

Q: session state在一些web服务器上工作,但是在其他服务器上不工作。
A: 可能是机器名的问题,见http://support.microsoft.com/default.aspx?scid=kb;EN-US;q316112

Q: 为什么session state不可用?
A:
– 首先,检查web.config、machine.config和Page标签来确认你启用了session state
参考资料:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconsessionstate.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/cpconpage.asp
– 请注意session state并非在任何地方、任何时间都可以使用,它仅在HttpApplication.AcquireRequestState事件之后可用。例如,在 global.asax中的Application_OnAuthenticateRequest处理程序中,session state不可用
– 请确认System.Web.SessionState.SessionStateModule已包含在配置文件的< httpModules>节中。一个常见的例子是,出于性能考虑,SharePoint应用程序会把这个模块从web.config文件中移除,因此导致session不可用

Q: 为什么session_end没有触发?
A: 这是最常见的问题之一
1. 请记住session_end仅在InProc模式中可用
2. 关闭浏览器,session_end是不会触发的。HTTP是一种无状态协议,服务器没有办法知道你的浏览器是否已经关闭。
3. 当有n分钟(n=timeout值)的无操作或调用Session.Abandon时,Session_End才会触发
4. 对于情况1而言,Session_End将由一个后台线程触发,这表示:
a. Session_End中的代码使用工作者进程账号运行,如果你访问如数据库这样的资源时,可能会有权限问题。
b. 如果在Session_End中发生错误,程序不会通知发生了什么
5. 对于情况2而言,为了让Session_End触发,session state必须先存在。这意味着你必须在session state中存储一些数据,并且已经完成了至少一个请求
6. 还是对于情况2而言,Session_End仅在被丢弃的session被找到的时候才会触发。这样的话,如果你在同一个请求中创建并丢弃一个 session,由于session没有被保存,因此也不会被找到,Session_End将不会被调用。这是v1.0和v1.1中的bug。

Q: 使用InProc模式时,为什么我的session变量频繁丢失?
A: 有可能是应用程序资源回收引起的,见http://support.microsoft.com/default.aspx?scid=kb;en-us;Q316148
在v1.0中有一个bug可能会导致工作者进程重启动。在v1.1和v 1.0sp2中已经修复。见http://support.microsoft.com/default.aspx?scid=kb;EN-US;321792

关于应用程序资源回收的详细信息,请见我的另一篇:FAQhttp://www.asp.net/Forums/ShowPost.aspx?tabindex=1&PostID=232621

Q: 在session超时或删除之后,为什么SessionID保持不变
A: 尽管在超时周期之后session state过期,sessionID将一直保持到浏览器session过期为止,也就是说,一个相同的sessionID可以有多次session超时,但是始终对应着一个相同的浏览器实例。

Q: 为什么SessionID每一次请求都会改变
A: 如果你的应用程序从未在session state中存储过数据。在这种情况下,那么每次请求都会创建一个新的session state(ID也是新的),但是不会被存储,因为里面什么数据都没有。

尽管如此,有两种例外可能产生相同的Session ID
– 如果用户使用相同的浏览器实例来请求另一个使用session state的页面,那么你每次获得的Session ID是相同的。详见“在session超时或删除之后,为什么SessionID保持不变?”
– 如果使用了Session_OnStart事件,即使session为空,asp.net也会保存session state。

Q: Session.Abandon()和Session.Clear()有什么区别
A: 主要的区别在于,如果你调用Session.Abandon(), Session_End将被触发(仅在InProcxi下适用),在下一个请求中,Session_Start触发。而Session.Clear()仅仅是清除数据,但没有删除session。

Q: session的Timeout属性是一个滑动超时值吗?
A: Session的Timeout是一个滑动过期时间,意思是一旦你的页面访问session state,过期时间就会向挪。注意,只要页面没有被禁用,在请求时页面就会自动访问session

Q: 我可以在ASP.NET和ASP之间共享session吗?
A:不可以。但是有一篇文章讲到了如何来绕过这个问题:http://www.msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/ConvertToASPNET.asp

当然也有一些第三方解决方案。

Q: 我可以在web应用程序(例如虚拟目录或者IIS的应用程序)间共享session state吗?
A:不能。

Q: 在session state中可以存储哪些类型的对象?
A:这是由你使用的模式决定的
– 如果你使用的是InProc模式,存储在session state中的对象是活对象,那么你就可以存储你创建的任何对象
– 如果你使用的是SQLServer或State Server模式,当处理一个请求时,session state中的对象对象将被序列化和反序列化,所以请确认你的对象都是可序列化的,而它们的类都作了可序列化标记。如果没有,session state将不会成功存储。在v1.0中,有一个bug,当这个问题发生时,如果使用SQLServer模式,请求可能在不知情的情况下被挂起。挂起的问题在v1.1和v1.0 sp3中已经修复。KB324479的QFE fix也包含了对这一问题的修复。

更多信息请见:http://support.microsoft.com/directory/article.asp?ID=KB;EN-US;q312112

Q: 为什么我的请求在切换到SQLServer模式之后挂住了?
A:请看问题“在session state中可以存储哪些类型的对象?”的答案

Q: 为什么Response.Redirect和Server.Transfer在Session_End中不工作?
A:Session_End是在服务器内部触发的,它基于一个内部的计时器。因此,在事件触发时,与任何HttpRequest对象无关。这也是为什么Response.Redirect 和Server.Transfer不工作的原因。

Q: 在Session_End中,我可以获得一个有效的HttpSessionState对象和HttpContext对象吗?
A: 你可以获得httpSessionState对象,你可以使用'Session'来访问该对象。但是你无法访问HttpContext,因为这个事件和请求没有任何关系。

Q: 在web service中如何使用session?
A: 需要在调用方使用一些技巧,你必须保存web服务使用的cookie。请见关于HttpWebClientProtocol.CookieContainer的MSDN文档。

尽管如此,如果你是通过代理对象从你的页面调用web服务,由于架构限制,web服务和你的页面无法共享session state。

如果你通过redirect调用web服务,这是可以完成的

Q:我正在写一个HttpHandler,为什么session stae不工作

沙发空着?抢! »

.NET 中的对象序列化

摘要:为什么要使用序列化?最重要的两个原因是:将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本;按值将对象从一个应用程序域发送至另一个应用程序域。例如,序列化可用于在 ASP.NET 中保存会话状态,以及将对象复制到 Windows 窗体的剪贴板中。它还可用于按值将对象从一个应用程序域远程传递至另一个应用程序域。本文简要介绍了 Microsoft .NET 中使用的序列化。

简介
序列化是指将对象实例的状态存储到存储媒体的过程。在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。

在面向对象的环境中实现序列化机制时,必须在易用性和灵活性之间进行一些权衡。只要您对此过程有足够的控制能力,就可以使该过程在很大程度上自动进行。例如,简单的二进制序列化不能满足需要,或者,由于特定原因需要确定类中那些字段需要序列化。以下各部分将探讨 .NET 框架提供的可靠的序列化机制,并着重介绍使您可以根据需要自定义序列化过程的一些重要功能。

持久存储
我们经常需要将对象的字段值保存到磁盘中,并在以后检索此数据。尽管不使用序列化也能完成这项工作,但这种方法通常很繁琐而且容易出错,并且在需要跟踪对象的层次结构时,会变得越来越复杂。可以想象一下编写包含大量对象的大型业务应用程序的情形,程序员不得不为每一个对象编写代码,以便将字段和属性保存至磁盘以及从磁盘还原这些字段和属性。序列化提供了轻松实现这个目标的快捷方法。

公共语言运行时 (CLR) 管理对象在内存中的分布,.NET 框架则通过使用反射提供自动的序列化机制。对象序列化后,类的名称、程序集以及类实例的所有数据成员均被写入存储媒体中。对象通常用成员变量来存储对其他实例的引用。类序列化后,序列化引擎将跟踪所有已序列化的引用对象,以确保同一对象不被序列化多次。.NET 框架所提供的序列化体系结构可以自动正确处理对象图表和循环引用。对对象图表的唯一要求是,由正在进行序列化的对象所引用的所有对象都必须标记为 Serializable(请参阅基本序列化)。否则,当序列化程序试图序列化未标记的对象时将会出现异常。

当反序列化已序列化的类时,将重新创建该类,并自动还原所有数据成员的值。

按值封送
对象仅在创建对象的应用程序域中有效。除非对象是从 MarshalByRefObject 派生得到或标记为 Serializable,否则,任何将对象作为参数传递或将其作为结果返回的尝试都将失败。如果对象标记为 Serializable,则该对象将被自动序列化,并从一个应用程序域传输至另一个应用程序域,然后进行反序列化,从而在第二个应用程序域中产生出该对象的一个精确副本。此过程通常称为按值封送。

如果对象是从 MarshalByRefObject 派生得到,则从一个应用程序域传递至另一个应用程序域的是对象引用,而不是对象本身。也可以将从 MarshalByRefObject 派生得到的对象标记为 Serializable。远程使用此对象时,负责进行序列化并已预先配置为 SurrogateSelector 的格式化程序将控制序列化过程,并用一个代理替换所有从 MarshalByRefObject 派生得到的对象。如果没有预先配置为 SurrogateSelector,序列化体系结构将遵从下面的标准序列化规则(请参阅序列化过程的步骤)。

基本序列化
要使一个类可序列化,最简单的方法是使用 Serializable 属性对它进行标记,如下所示:

[Serializable]
public class MyObject {
public int n1 = 0;
public int n2 = 0;
public String str = null;
}
以下代码片段说明了如何将此类的一个实例序列化为一个文件:

MyObject obj = new MyObject();
obj.n1 = 1;
obj.n2 = 24;
obj.str = "一些字符串";
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin", FileMode.Create,
FileAccess.Write, FileShare.None);
formatter.Serialize(stream, obj);
stream.Close();
本例使用二进制格式化程序进行序列化。您只需创建一个要使用的流和格式化程序的实例,然后调用格式化程序的 Serialize 方法。流和要序列化的对象实例作为参数提供给此调用。类中的所有成员变量(甚至标记为 private 的变量)都将被序列化,但这一点在本例中未明确体现出来。在这一点上,二进制序列化不同于只序列化公共字段的 XML 序列化程序。

将对象还原到它以前的状态也非常容易。首先,创建格式化程序和流以进行读取,然后让格式化程序对对象进行反序列化。以下代码片段说明了如何进行此操作。

IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin", FileMode.Open,
FileAccess.Read, FileShare.Read);
MyObject obj = (MyObject) formatter.Deserialize(fromStream);
stream.Close();

// 下面是证明
Console.WriteLine("n1: {0}", obj.n1);
Console.WriteLine("n2: {0}", obj.n2);
Console.WriteLine("str: {0}", obj.str);
上面所使用的 BinaryFormatter 效率很高,能生成非常紧凑的字节流。所有使用此格式化程序序列化的对象也可使用它进行反序列化,对于序列化将在 .NET 平台上进行反序列化的对象,此格式化程序无疑是一个理想工具。需要注意的是,对对象进行反序列化时并不调用构造函数。对反序列化添加这项约束,是出于性能方面的考虑。但是,这违反了对象编写者通常采用的一些运行时约定,因此,开发人员在将对象标记为可序列化时,应确保考虑了这一特殊约定。

如果要求具有可移植性,请使用 SoapFormatter。所要做的更改只是将以上代码中的格式化程序换成 SoapFormatter,而 Serialize 和 Deserialize 调用不变。对于上面使用的示例,该格式化程序将生成以下结果。

<SOAP-ENV:Envelope
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:SOAP- ENC=http://schemas.xmlsoap.org/soap/encoding/
xmlns:SOAP- ENV=http://schemas.xmlsoap.org/soap/envelope/
SOAP-ENV:encodingStyle=
"http://schemas.microsoft.com/soap/encoding/clr/1.0
http://schemas.xmlsoap.org/soap/encoding/"
xmlns:a1="http://schemas.microsoft.com/clr/assem/ToFile">

<SOAP-ENV:Body>
<a1:MyObject id="ref-1">
<n1>1</n1>
<n2>24</n2>
<str id="ref-3">一些字符串</str>
</a1:MyObject>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
需要注意的是,无法继承 Serializable 属性。如果从 MyObject 派生出一个新的类,则这个新的类也必须使用该属性进行标记,否则将无法序列化。例如,如果试图序列化以下类实例,将会显示一个 SerializationException,说明 MyStuff 类型未标记为可序列化。

public class MyStuff : MyObject
{
public int n3;
}
使用序列化属性非常方便,但是它存在上述的一些限制。有关何时标记类以进行序列化(因为类编译后就无法再

沙发空着?抢! »

想要做好老板先要懂得怎样留住员工

一天,一只兔子在山洞前写文章,
一只狼走了过来,问:“兔子啊,你在干什么?”
答曰:“写文章。”问:“什么题目?”答曰:“《浅谈兔子是怎样吃掉狼的》。”
狼哈哈大笑,表示不信,于是兔子把狼领进山洞。
过了一会,兔子独自走出山洞,继续写文章。
一只野猪走了过来,问:“兔子你在写什么?”答:“文 章。”问:“题目是什么?”
答:“《浅谈兔子是如何把野猪吃掉的》。”野猪不信,于是同样的事情发生。
最后,在山洞里,一只狮子在一堆白骨之间,满意的剔着牙读着兔子交给它的文章,
题目:“《一只动物,能力大小关键要看你的老板是谁》。”

这只兔子有次不小心告诉了他的一个兔子朋友,这消息逐渐在森林中传播;
狮子知道后非常生气,他告诉兔子:“如果这个星期没有食物进洞,我就吃你。”
于是兔子继续在洞口写文章
一只小鹿走过来,“兔子,你在干什么啊?”
“写文章”“什么题目”““《浅谈兔子是怎样吃掉狼的》”
“哈哈,这个事情全森林都知道啊,你别胡弄我了,我是不会进洞的”
“我马上要退休了,狮子说要找个人顶替我,难道你不想这篇文章的兔子变成小鹿么”
小鹿想了想,终于忍不住诱惑,跟随兔子走进洞里。
过了一会,兔子独自走出山洞,继续写文章
一只小马走过来,同样是事情发生了。
最后,在山洞里,一只狮子在一堆白骨之间,满意的剔着牙读着兔子交给它的文章
题目是:如何发展下线动物为老板提供食物

随着时间的推移,狮子越长越大,兔子的食物已远远不能填饱肚子。
一日,他告诉兔子:“我的食物量要加倍,例如:原来4天一只小鹿,现在要2天一只,如果一周之内改变不了局面我就吃你。
于是,兔子离开洞口,跑进森林深处,他见到一只狼
“你相信兔子能轻松吃掉狼吗”
狼哈哈大笑,表示不信,于是兔子把狼领���山洞。
过了一会,兔子独自走出山洞,继续进入森林深处
这回他碰到一只野猪—-“你相信兔子能轻松吃掉野猪吗”
野猪不信,于是同样的事情发生了。
原来森林深处的动物并不知道兔子和狮子的故事
最后,在山洞里,一只狮子在一堆白骨之间,满意的剔着牙读着兔子交给它的文章
题目是:如何实现由坐商到行商的转型为老板提供更多的食物

时间飞快,转眼之间,兔子在森林里的名气越来越大
因为大家都知道它有一个很历害的老板
这只小兔开始横行霸道,欺上欺下,没有动物敢惹
它时时想起和乌龟赛跑的羞辱
它找到乌龟说:“三天之内,见我老板!”扬长而去
乌龟难过的哭了
这时却碰到了一位猎人
乌龟把这事告诉了他
猎人哈哈大笑
于是森林里发生了一件重大事情
猎人披着狮子皮和乌龟一起在吃兔子火锅
地下丢了半张纸片歪歪扭扭的写着:山外青山楼外楼,强中还有强中手啊!!

在很长一段时间里森林里恢复了往日的宁静,兔子吃狼的故事似乎快要被大家忘记了
不过一只年轻的老虎在听说了这个故事后,被激发了灵感
于是他抓住了一只羚羊,对羚羊说,如果你可以象以前的兔子那样为我带来食物那我就不吃你。
于是,羚羊无奈的答应了老虎,而老虎也悠然自得的进了山洞。
可是三天过去了,也没有见羚羊领一只动物进洞。他实在憋不住了,想出来看看情况。
羚羊早已不在了,他异常愤怒。正在他暴跳如雷的时候突然发现了羚羊写的一篇文章
题目是:《想要做好老板先要懂得怎样留住员工》

沙发空着?抢! »

Session丢失的解决

SessionState 的Timeout),其主要原因有三种。
一:有些杀病毒软件会去扫描您的Web.Config文件,那时Session肯定掉,这是微软的说法。
二:程序内部里有让Session掉失的代码,及服务器内存不足产生的。
三:程序有框架页面和跨域情况。
第一种解决办法是:使杀病毒软件屏蔽扫描Web.Config文件(程序运行时自己也不要去编辑它)
第二种是检查代码有无Session.Abandon()之类的。
第三种是在Window服务中将ASP.NET State Service 启动。

下面是帮助中的内容:
(ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconsessionstate.htm)
ASP.NET 提供一个简单、易于使用的会话状态模型,您可以使用该模型跨多个 Web 请求存储任意数据和对象。它使用基于字典的、内存中的对象引用(这些对象引用存在于 IIS 进程中)缓存来完成该操作。使用进程内会话状态模式时请考虑下面的限制:

使用进程内会话状态模式时,如果 aspnet_wp.exe 或应用程序域重新启动,则会话状态数据将丢失。这些重新启动通常会在下面的情况中发生:
在应用程序的 Web.config 文件的 <processModel> 元素中,设置一个导致新进程在条件被满足时启动的属性,例如 memoryLimit。
修改 Global.asax 或 Web.config 文件。
更改到 Web 应用程序的 Bin 目录。
用杀毒软件扫描并修改 Global.asax 文件、Web.config 文件或 Web 应用程序的 Bin 目录下的文件。
如果在应用程序的 Web.config 文件的 <processModel> 元素中启用了网络园模式,请不要使用进程内会话状态模式。否则将发生随机数据丢失。

还有这二种:

一:在第一个页面置了SESSION,然后REDIRECT去第二个页面。解决方法是在REDIRECT中设置endResponse为FALSE。

二: ASP.NET中使用了ACCESS数据库,而且数据库是放在bin目录中的。解决方法是不要放会更新的文件在BIN目录中。

参考:http://www.dotnet247.com/247reference/msgs/58/290316.aspx

Asp.net 默认配置下,Session莫名丢失的原因及解决办法

正常操作情况下Session会无故丢失。因为程序是在不停的被操作,排除Session超时的可能。另外,Session超时时间被设定成60分钟,不会这么快就超时的。

这次到CSDN上搜了一下帖子,发现好多人在讨论这个问题,然后我又google了一下,发现微软网站上也有类似的内容。

现在我就把原因和解决办法写出来。

原因:

由于Asp.net程序是默认配置,所以Web.Config文件中关于Session的设定如下:
<sessionState mode='InProc' stateConnectionString='tcpip=127.0.0.1:42424' sqlConnectionString='data source=127.0.0.1;Trusted_Connection=yes' cookieless='true' timeout='60'/>

我们会发现sessionState标签中有个属性mode,它可以有3种取值:InProc、StateServer?SQLServer(大小写敏感) 。默认情况下是InProc,也就是将Session保存在进程内(IIS5是aspnet_wp.exe,而IIS6是W3wp.exe),这个进程不稳定,在某些事件发生时,进程会重起,所以造成了存储在该进程内的Session丢失。

哪些情况下该进程会重起呢?微软的一篇文章告诉了我们:
1、配置文件中processModel标签的memoryLimit属性
2、Global.asax或者Web.config文件被更改
3、Bin文件夹中的Web程序(DLL)被修改
4、杀毒软件扫描了一些.config文件。
更多的信息请参考PRB: Session variables are lost intermittently in ASP.NET applications

解决办法:

前面说到的sessionState标签中mode属性可以有三个取值,除了InProc之外,还可以为StateServer、SQLServer。这两种存Session的方法都是进程外的,所以当aspnet_wp.exe重起的时候,不会影响到Session。

现在请将mode设定为StateServer。StateServer是本机的一个服务,可以在系统服务里看到服务名为ASP.NET State Service的服务,默认情况是不启动的。当我们设定mode为StateServer之后,请手工将该服务启动。

这样,我们就能利用本机的StateService来存储Session了,除非电脑重启或者StateService崩掉,否则Session是不会丢的(因Session超时被丢弃是正常的)。

除此之外,我们还可以将Session通过其他电脑的StateService来保存。具体的修改是这样的。同样还在sessionState标签中,有个stateConnectionString='tcpip=127.0.0.1:42424'属性,其中有个ip地址,默认为本机(127.0.0.1),你可以将其改成你所知的运行了StateService服务的电脑IP,这样就可以实现位于不同电脑上的Asp.net程序互通Session了。

如果你有更高的要求,需要在服务期重启时Session也不丢失,可以考虑将mode设定成SQLServer,同样需要修改sqlConnectionString属性。关于使用SQLServer保存Session的操作,请访问这里。

在使用StateServer或者SQLServer存储Session时,所有需要保存到Session的对象除了基本数据类型(默认的数据类型,如int、string等)外,都必须序列化。只需将[Serializable]标签放到要序列化的类前就可以了。
如:
[Serializable]
public class MyClass
{
……
}
具体的序列化相关的知识请参这里。

至此,问题解决。
原文:http://www.cnblogs.com/supersand/archive/2006/05/20/404919.html

沙发空着?抢! »

防止对 .net 的反向工程(反编译)

http://www.microsoft.com/china/msdn/library/langtool/vcsharp/misNETCodeObfuscation.mspx?mfr=true

沙发空着?抢! »

为 DataList、Repeater 或 GridView 项中的自定义按钮添加事件

个人经验总结的步骤:
1.在控件模板中添加 Button、LinkButton 或 ImageButton 控件。
2,将按钮的 CommandName 属性设置为标识其功能的字符串,如 “Copy” 或 “AddToCart” 。
3.使用 CommandArgument 属性将行的索引或者其他参数传给事件处理方法。
4.创建用于容器控件的 ItemCommand 事件的方法。在该方法中,执行下列操作:

    [*]检查事件参数对象的 CommandName 属性来查看传入什么字符串。
    [*]读取 CommandArgument 传递过来的参数
    [*]为用户单击的按钮执行相应的逻辑。

代码例

protected void DataList1_ItemCommand(object source,
DataListCommandEventArgs e)
{
if (e.CommandName == "AddToCart")
{
//事件逻辑代码
}
}

沙发空着?抢! »

两则招聘,无语

河北卓越科技信息有限公司招聘

不看文凭,只看人品,只看潜力
需要说的少,做的多的员工
招聘职位:软件编程
招聘人数:2人
要求:
1、男生,农村出身,身体健康,3年内不谈女朋友;
2、为人善良,忠诚,老实、勤奋,遵守公司制度,舍得吃苦,没有吸烟等不良嗜好;
3、爱好编程,就象爱好打游戏一样,把编程当成终生事业;
4、不善交际,能吃苦,坐的住,能够约束自己,没有其他生存途径,愿意长期从事编程的员工;
5、公司管吃住,轮流做饭,24小时在公司,没有节假日,加班的概念,工作休息自主决定;
6、实行年工资,应届学生,第一年最少拿5000元回家过年;
7、大学期间,自己有微机,有c#或c++基础,机器带到公司。

原文地址:
http://www.hbsc.cn/members/zw_30262.html

另外一则是改编的:

我爱黑社会暴力有限公司招聘
不看文凭,只看肌肉,只看格斗 需要说的少,打的多的员工
招聘职位:堂口蹲守总监
招聘人数:2人
要求:
1、男生,农村出身,三代贫农,这辈子不谈女朋友;
2、为人奸险,淫荡,小气、力气大,遵守公司制度,能喝酒,有吸烟等不良嗜好;
3、爱好打架,就象爱好**一样,把打架当成终生事业;
4、不善交际,能打架,坐着打架,能够约束自己去打架,没有其他生存途径,愿意长期从事打架斗殴的员工;
5、公司管吃住,轮流打假,24小时在公司外打,没有节假日,加班的概念,打架和被打自主决定;
6、实行受伤工资,应届学生,第一年最少拿5000元回家过年;
7、大学期间,自己有砍刀,有双节棍或青龙偃月刀使用基础,武器带到公

地板还有?占! »

系统和 Mozilla Firefox 的兼容性

做的系统,一直在 ie 下测试。
今天用 Mozilla Firefox 打开一看后台,基本上没有兼容性问题。窃喜中。。。
当然还是出现了一小点兼容性问题,也可以说是我的错误吧:

    [*]javascript 文件中有一句没有写;结尾的莫名其妙的词。ie跳过了,Mozilla Firefox可不认,说那是错误。
    [*]一个按钮的 css 高度忘了设置,在 Mozilla Firefox 下很难看。ie自动了,Mozilla Firefox不认。

其他的 javascript 和 css 都没有问题,看来兼容性只要自己按照标准做了,不用这么测试就 ok。
下次在弄 ie 7 测试测试看看。

沙发空着?抢! »

几则笑话

吐壳
公共汽车上有人放屁。一妖艳女子口吐唾沫,“呸——呸——呸——”。有男士道:怎么,吃了屁还吐壳?!

生意真好
去饭店吃饭,有个哥儿们中途去厕所,回来后很神秘的告诉我们:“这家酒店的生意太好了,连厕所里都摆着两桌!”大伙正奇怪的时候,一伙人冲了过来,揪起那哥儿们就要打。我们当然不干了,问他们:他又没惹着你们,你们打他干什么?“打他干什么?我们吃饭吃的好好的,可这家伙跑到我们包房里撒了泡尿就走。”

到家了
我的一个邻居,喜欢喝酒,常醉。有一次,他喝醉之后上了出租车,司机缓缓开着车等他说去哪里。可等了半天也没动静,回头一看,他正脱衣服呢。司机吓一跳,连忙问:“先生,你这是干什么!”他说:“到家了,我要脱衣服睡觉!”司机:“这是我的车,不是你的家。”他呆呆想了一会儿,大声喊:“快,快回到我上车的地方去!”司机问为什么,他说:“我刚才以为到家了,把鞋给脱门口了!”

把车还我
我一哥儿,就喜欢酒后驾车,一次,回家时正碰上警察在查车。就在他暗叫倒霉下车接受检查的时候,警察接了个电话,捧着手机,指手划脚,滔滔不绝的说了起来。他一看有机可趁,就悄悄的返回车里,趁打电话的警察不备,风风火火的把车开回了家。
到了第二天,有人来敲他家的门,正是昨天的那个警察。他的酒现在已经醒了,自然理直气壮的质问警察:“你来干什么?有什么事?”警察说:“你的车我已经给你开到了门口,现在,你把警车还给我吧。”

沙发空着?抢! »

陷害无罪

1.找一个朋友,让他先说3遍“老鼠”,然后再说3遍“鼠老”,待他说完“老鼠,老鼠,老鼠,鼠老,鼠老,鼠老”之后,立即问他“猫最怕什么”,几乎可以保证他会答“老鼠”,本人试过多次,屡试不爽。

2.随便找3个东西,比如3个杯子吧,你敲第一个时让你的朋友说“忘”,敲第二个说“情”,第三个说“水”,美其名曰测试你朋友的反映速度,几次之后,不停的敲第一个,3. 你的朋友如果跟着说“忘,忘,忘,忘,汪,汪,汪,汪,汪,……”呵呵,效果就出来了。

3.找一个MM,说是测试她的英文能力。由你说一个单词,MM说这个单词的第二个字母。开始时随便说几个,接着好戏开始。
先说husband,MM会说u(you);
  再说wife,MM会说i(I);
  反复。
  明白了吗?

4.你问他:“一个三点水加一个来是什么?”
  他想了一想说:“不确定,涞(LAI)?”
  你再问:“一个三点水加一个去呢?”
  他八成会说:“…什么字?有这个字吗?去?”
  其实应该是“法”……

5. 伸出1个手指,问别人“这是几”
  再次伸出2个手指,问别人“这是几”
  再次伸出3个手指,问别人“1+1是几”
  10人里最多1人答对

6.看看王朔的小说,《一半是火焰,一半是海水》里面的游戏很有意思。就是手中夹硬币然后回答问题的那一个
  问比1大的数字有吗?对方说有
  再问比10大的有没有?对方说有
  直到说到100000——
  最后问比你傻的傻瓜的有没有?对方回很警觉的说“没有”!

7.顺便说一个:你可以对你的MM说我要测测你的英语反应能力,伸出左手,对她说:“我点拇指是A,食指是C,中指是M,无名指是S,小指是X”,然后说,为了增加难度,我会用中文干扰你。然后,你指中指说鱼,她会说m,你指无名指说驴,她会说S,然后在指拇指说猪,她会说A,然后一直点拇指说猪,她会一直说:A,A,A,A,A,A,如果MM聪明,可以多试其他的手指之后再说拇指。

8.劝MM酒时对她说:我喝清一杯,你喝一口
  然后重复….我清,你一口……….

9.把双手放在大腿上,然后左手作向前摩擦的动作,右手就做上下捶击的动作,作几下,然后换手作,改成右手向前作摩擦的动作,左手做上下捶击的动作……如此反复…
  对了,速度要快些,慢了就没效果了。呵呵 试试吧,大多数人不能的说

10.甲:除了人什么动物最爱问“为什么”?
  乙:不知道。
  甲:是猪!
  乙:为什么?
  哈!!!

11. 说个老故事吧,人越多得场合越好:
  冒险故事.爷孙出海经历险!
  爷爷是个水性很熟的渔夫,这天,天气很好,他喊了小孙子一起出海打鱼。
  谁知刚出海不久,天气突变,海上起了风浪。小孙子很害怕,爷爷就安慰他:乖孙别怕,爷爷这么多年的技术了,这点风浪怕啥?
  突然,一个大浪头打过来,把船浆给劈头打成两节. !
  爷爷无奈地对孙儿说:乖孙啊,浆完了!

12. 猪的英语拼写是PUG吧?
  –不对,是PIG
  –不是吧,我怎么记得是U(YOU)呀
  -你弄错了,是I
  –猪是YOU
  –猪是I

地板还有?占! »
Pages: 1 2 ... 5 6 7 8 9 ... 59 60