ITPub博客

首页 > 应用开发 > IT综合 > ASP.NET内置对象

ASP.NET内置对象

IT综合 作者:qiqubaike 时间:2014-05-21 10:09:52 0 删除 编辑

 1.    Application对象简介

Application对象是HttpApplicationState类的一个实例,Application状态是整个应用程序全局的。Application对象在服务器内存中存储数量较少又独立于用户请求的数据。由于它的访问速度非常快而且只要应用程序不停止,数据一直存在,我们通常在Application_Start的时候去初始化一些数据,在以后的访问中可以迅速访问和检索。

Application对象在实际网络开发中的用途就是记录整个网络的信息,如上线人数、在线名单、意见调查和网上选举等。在给定的应用程序的多有用户之间共享信息,并在服务器运行期间持久的保存数据。而且Application对象还有控制访问应用层数据的方法和可用于在应用程序启动和停止时触发过程的事件。
Global.asax
(通常我们不改名)是一个用来处理应用程序全局的事件。打开文件,系统已经为我们定义了一些事件的处理方法。

1.   void Application_Start(object sender, EventArgs e)

2.         

3.            {

4.                // 在应用程序启动时运行的代码

5.            }

6.         

7.            void Application_End(object sender, EventArgs e)

8.            {

9.                // 在应用程序关闭时运行的代码

10.         }

11.      

12.         void Application_Error(object sender, EventArgs e)

13.         {

14.             // 在出现未处理的错误时运行的代码

15.         }

16.      

17.         void Session_Start(object sender, EventArgs e)

18.         {

19.             // 在新会话启动时运行的代码

20.         }

21.      

22.         void Session_End(object sender, EventArgs e)

23.         {

24.             // 在会话结束时运行的代码

25.      

26.             // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为InProc 时,才会引发 Session_End 事件

27.      

28.             // 如果会话模式设置为 StateServer 或 SQLServer,则不会引发该事件

29.         }

通过这些注释我们可以看到,这些事件是整个应用程序的事件,和某一个页面没有关系。

2.    Application对象的应用

 

1)     使用Application对象保存信息

 

(1)、使用Application对象保存信息

 

Application(“键名”) = 值

或 Application(“键名”,值)

 

(2)、获取Application对象信息

 

变量名 = Application(“键名”)

或:变量名 = Application.Item(“键名”)

或:变量名 = Application.Get(“键名”)

 

(3)、更新Application对象的值

 

Application.Set(“键名”, 值)

 

(4)、删除一个键

 

Application.Remove(“键名”, 值)

 

(5)、删除所有键

 

Application.RemoveAll()

或Application.Clear()

 

2)     有可能存在多个用户同时存取同一个Application对象的情况

 

这样就有可能出现多个用户修改同一个Application命名对象,造成数据不一致的问题。

HttpApplicationState类提供两种方法Lock和Unlock,以解决对Application对象的访问同步问题,一次只允许一个线程访问应用程序状态变量。

关于锁定与解锁

锁定:Application.Lock()

访问:Application(“键名”) = 值

解锁:Application.Unlock()

注意:Lock方法和UnLock方法应该成对使用。

可用于网站访问人数,聊天室等设备

3)     使用Application事件

在ASP.NET应用程序中可以包含一个特殊的可选文件—Global.asax文件,也称作ASP.NET应用程序文件,它包含用于响应ASP.NET或HTTP模块引发的应用程序级别事件的代码。

Application总结

在ASP.NET 2.0中,Application已经变得不是非常重要了。因为Application的自我管理功能非常薄弱,它没有类似Session的超时机制。也就是说,Application中的数据只有通过手动删除或者修改才能释放内存,只要应用程序不停止,Application中的内容就不会消失。在下一节中,我们会看到,可以使用Cache实现类似Application的功能,同时Cache又有丰富而强大的自我管理机制。

总结一下Application的特性:

?      存储的物理位置。服务器内存。

?      存储的类型限制。任意类型。

?      状态使用的范围。整个应用程序。

?      存储的大小限制。任意大小。

?      生命周期。应用程序开始的时候创建(准确来说是用户第一次请求某URL的时候创建),应用程序结束的时候销毁。

?      安全与性能。数据总是存储在服务端,安全性比较高,但不易存储过多数据。

?      优缺点与注意事项。检索数据速度快,但缺乏自我管理机制,数据不会自动释放。

Session对象

asp.net中Session又称为会话状态,是Web系统中最常用的状态,用户首次与Web服务器建立连接的时候,服务器会给用户分发一个 SessionID作为标识。每个客户端的Seesion是独立存储的。Session不能跨进程访问,只能由该会话的用户访问。当会话终止,或过期时,服务器就清除Session对象。Session保存的数据是跨页面全局型的。

session是怎么存储,提取的?

在服务器端有一个session池,用来存储每个用户提交session中的数据,Session对于每一个客户端(或者说浏览器实例)是“人手一份”,用户首次与Web服务器建立连接的时候,服务器会给用户分发一个SessionID作为标识。SessionID是一个由24个字符组成的随机字符串。用户每次提交页面,浏览器都会把这个SessionID包含在HTTP头中提交给Web服务器,这样Web服务器就能区分当前请求页面的是哪一个客户端,而这个SessionID是一cookie的方式保存的在客户端的内存中的,如果想要得到Session池中的数据,服务器就会根据客户端提交的唯一SessionID标识给出相应的数据返回。

 

Session池中每个客户端的数据是怎么存储的?

1.存储在Session池中的数据是全局型的数据,可以跨页面访问,每个SessionID中只存储唯一的数据,如:首先你这样设定:session["userName"]="admin",然后你在会话还没结束的session还没过期的情况下,你又设定:session["userName"]="123";这样这个SessionID没变,然而Session池中的数据则被覆盖。此时session["userName"]的值就是“123”,而不是其它。

2.Session池中的数据不能跨进程访问。如:打开一个页面写入session[“userName”]="admin";然后login页面不关闭,即此会话不结束,在这是你再在另外一个浏览器中打开一个login.aspx页面则session["userName"]=null

 

session的声明周期与销毁

 

1.session存储数据计时是滚动计时方式。具体是这样的,如果你打开写入session,从写入开始,此页面如果一直没有提交操作,则默认时间是20分钟,20分钟后session被服务器自动销毁,如过有提交操作,服务器会从提交后重新计时以此类推,直至设定时间内销毁。

2.可以设置session的销毁时间。上面代码有提到。

3、session中保存的数据是在服务端的,而每个用户如进行登录操作,都要进行session数据写入,所以建议慎用session,就是少用。

ASP.NET操作session的方法

1.   public static class SessionHelper2

2.         

3.            {

4.                ///

5.                /// 添加Session,调动有效期为20分钟

6.                ///

7.                /// Session对象名称

8.                /// Session值

9.                public static void Add(string strSessionName, string strValue)

10.             {

11.                 HttpContext.Current.Session[strSessionName] = strValue;

12.                 HttpContext.Current.Session.Timeout = 20;

13.             }

14.      

15.             ///

16.             /// 添加Session,调动有效期为20分钟

17.             ///

18.             /// Session对象名称

19.             /// Session值数组

20.             public static void Adds(string strSessionName, string[] strValues)

21.             {

22.                 HttpContext.Current.Session[strSessionName] = strValues;

23.                 HttpContext.Current.Session.Timeout = 20;

24.             }

25.      

26.             ///

27.             /// 添加Session

28.             ///

29.             /// Session对象名称

30.             /// Session值

31.             /// 调动有效期(分钟)

32.             public static void Add(string strSessionName, string strValue, int iExpires)

33.             {

34.                 HttpContext.Current.Session[strSessionName] = strValue;

35.                 HttpContext.Current.Session.Timeout = iExpires;

36.             }

37.      

38.             ///

39.             /// 添加Session

40.             ///

41.             /// Session对象名称

42.             /// Session值数组

43.             /// 调动有效期(分钟)

44.             public static void Adds(string strSessionName, string[] strValues, int iExpires)

45.             {

46.                 HttpContext.Current.Session[strSessionName] = strValues;

47.                 HttpContext.Current.Session.Timeout = iExpires;

48.             }

49.      

50.             ///

51.             /// 读取某个Session对象值

52.             ///

53.             /// Session对象名称

54.             /// Session对象值

55.             public static string Get(string strSessionName)

56.             {

57.                 if (HttpContext.Current.Session[strSessionName] == null)

58.                 {

59.                     return null;

60.                 }

61.                 else

62.                 {

63.                     return HttpContext.Current.Session[strSessionName].ToString();

64.                 }

65.             }

66.      

67.             ///

68.             /// 读取某个Session对象值数组

69.             ///

70.             /// Session对象名称

71.             /// Session对象值数组

72.             public static string[] Gets(string strSessionName)

73.             {

74.                 if (HttpContext.Current.Session[strSessionName] == null)

75.                 {

76.                     return null;

77.                 }

78.                 else

79.                 {

80.                     return (string[])HttpContext.Current.Session[strSessionName];

81.                 }

82.             }

83.      

84.             ///

85.             /// 删除某个Session对象

86.             ///

87.             /// Session对象名称

88.             public static void Del(string strSessionName)

89.             {

90.                 HttpContext.Current.Session[strSessionName] = null;

91.             }

92.         }

asp.net Session丢失的原因

原因1:

bin目录中的文件被改写,asp.net有一种机制,为了保证dll重新编译之后,系统正常运行,它会重新启动一次网站进程,这时就会导致Session丢失,所以如果有access数据库位于bin目录,或者有其他文件被系统改写,就会导致Session丢失

原因2:

文件夹选项中,如果没有打开“在单独的进程中打开文件夹窗口”,一旦新建一个窗口,系统可能认为是新的Session会话,而无法访问原来的Session,所以需要打开该选项,否则会导致Session丢失

原因3:

似乎大部分的Session丢失是客户端引起的,所以要从客户端下手,看看cookie有没有打开

原因4:

Session的时间设置是不是有问题,会不会因为超时造成丢失

原因5:

IE中的cookie数量限制(每个域20个cookie)可能导致session丢失

原因6:

使用web garden模式,且使用了InProc mode作为保存session的方式

Server对象

ASP.NET中Server对象提供对服务器上的方法和属性的访问以及进行HTML编码的功能,这些功能分别由Server对象相应的方法和属性完成。在Asp.net WebForm中,Server对象是HttpServerUtility类的实例,而在Asp.net MVC中,Server对象是HttpServerUtilityBase对象。

ASP.NET中Server对象是context的一个属性,是HttpServerUtility类的一个对象

1.    Server对象的常用属性

(1).MachineName

(2).ScriptTimeout:属性用于设置脚本程序执行的时间,适当地设置脚本程序的ScriptTimeout可以提高整个Web应用程序的效率。

语法如下:

Server.ScriptTimeout=time;(以s(秒)为单位)

ScriptTimeout属性的最短时间默认为90 s。对于一些逻辑简单、活动内容较少的脚本程序该值已经足够。但在执行一些活动内容较多的脚本程序时,就显得小了些。比如访问数据库的脚本程序,必须设置较大的ScriptTimeout属性值,否则脚本程序就不能正常执行完毕。

代码

1.         public void ProcessRequest(HttpContext context)

2.        {

3.            context.Response.Write(context.Server.MachineName); //输出 KISSDODOG-PC 获取计算机名

4.            context.Response.Write(context.Server.ScriptTimeout); //输出 110

5.        }

2.    Server对象的主要方法

ClearError 清除前一个异常。

CreateObject 已重载。 创建 COM 对象的一个服务器实例。

CreateObjectFromClsid 创建 COM 对象的服务器实例,该对象由对象的类标识符 (CLSID) 标识。

Execute 已重载。 在当前请求的上下文中执行指定资源的处理程序,然后将执行返回给调用它的页。

GetLastError 返回前一个异常。

HtmlDecode 已重载。 对已被编码以消除无效 HTML 字符的字符串进行解码。

HtmlEncode 已重载。 对要在浏览器中显示的字符串进行编码。

MapPath 返回与 Web 服务器上的指定虚拟路径相对应的物理文件路径。 该方法经常使用。将虚拟路径转换为服务器物理路径。

Transfer 已重载。 终止当前页的执行,并为当前请求开始执行新页。

TransferRequest 已重载。 异步执行指定的 URL。

UrlDecode 已重载。 对字符串进行解码,该字符串针对 HTTP 传输进行了编码并在 URL 中发送到服务器。

UrlEncode 已重载。 编码字符串,以便通过 URL 从 Web 服务器到客户端进行可靠的 HTTP 传输。

UrlPathEncode 对 URL 字符串的路径部分进行 URL 编码并返回编码后的字符串。

UrlTokenDecode 将 URL 字符串标记解码为使用 64 进制数字的等效字节数组。

UrlTokenEncode 将一个字节数组编码为使用 Base 64 编码方案的等效字符串表示形式,Base 64 是一种适于通过 URL 传输数据的编码方案。

实例

1.       Server.MapPath

1.   context.Response.Write(context.Server.MapPath("/")); //输出 C:\\Users\\Administrator\\Desktop\\WebApplication1\\WebApplication1\\ //该方法经常用,将虚拟路径转换为物理路径

2.         

3.        context.Response.Write("

HtmlEncode测试

"); //如果不编码,默认就是会被浏览器解析的


4.         

5.        context.Response.Write(context.Server.HtmlEncode("

HtmlEncode测试")); //经过编码之后 原样输出

效果如下:

2、Excute方法

使用Server对象的Execute方法可以在当前页面中执行同一Web服务器上的另一页面,当该页面执行完毕后,请求上下文,包括表单数据,URL信息都都会传送过去。Server.Execute方法允许当前的ASPX页面执行一个同一Web服务器上的指定ASPX页面,当指定的ASPX页面执行完毕,控制流程重新返回原页面发出Server.Execute调用的位置。

test.aspx页面:

1.   public void ProcessRequest(HttpContext context)

2.        {

3.            context.Response.Write(\"我是第一个text.ashx处理结果\");

4.            context.Response.Write(\"
\");

5.            context.Server.Execute(\"/Default.aspx\");

6.            context.Response.Write(\"我是第二个text.ashx处理结果\");

7.        }

Default.aspx页面:

1.   protected void Page_Load(object sender, EventArgs e)

2.        {

3.            Response.Write(\"我是Default.aspx处理的输出!\");

4.        }

效果:

Server.Transfer与Response.Redirect方法类似,只是Response.Redirect的作用相似,不同之处在于,Response.Redirect是客户端发送请求到服务器,服务器执行Response.Redirect之后,返回302,浏览器接收到请求后,再次发送一次请求到要跳转的URL,而Server.Transfer的跳转完全是在服务器端,浏览器根本不知道已经跳转了,因此路径显示的仍然是原路径。

在网络状态较好的情况下,Redirect(url)方法效率最高!! 可重定向到同一台或非同一台服务器上的aspx或非aspx(html)资源

Server.Transfer方法和Server.Execute方法最灵活!! 但只能转到同一Application目录下,也有可能导致不期望的结果发生

Server.Execute方法占用资源最多.

字符串的编码与解码

在某些情况下,可能需要在网页中显示“段落标记

”之类的内容,而不希望浏览器将其中的

解释为HTML语言中的段落标记;在上述场合,应当调用Server对象的HtmlEncode方法对要在浏览器中显示的字符串进行编码

有时候,在传递参数时,是将数据附在网址后面传递,但是如果遇到一些如“#”等特殊字符的时候,就会读不到这些字符后面的参数。所以需要在传递特殊字符的时候,需先将要传递的内容先以UrlEncode编码,这样才可以保证所传递的值可以被顺利读到。

另外有些服务器对中文不能很好的支持,这时候也需要利用UrlEncode对其进行编码,以被服务器所识别。

1.   protected void Page_Load(object sender, System.EventArgs e)

2.         

3.        {

4.            Response.Write(Server.HtmlEncode(\\\"粗体标记为:粗体文字\\\"));//HtmlEncode对字符串进行HTML编码并返回编码后的字符串,所以这个原样输出

5.            Response.Write(\\\"
\\\");

6.            Response.Write(Server.HtmlDecode(\\\"粗体标记为:粗体文字\\\"));//HtmlDecode对字符串进行HTML解码并返回解码后的字符串,所以这个后面加粗

7.            Response.Write(\\\"没有编码的参数内容
\\\");//
在1.aspx页面输出:
name@

8.            Response.Write(\\\"没有编码的参数内容
\\\");//
在1.aspx页面输出:
name@

9.            Response.Write(\\\"编码的参数内容
\\\");//
在1.aspx页面输出:
name@#163.com

10.         Response.Write(Server.UrlDecode(\\\"name@#163.com\\\"));//对字符串进行URL解码,这里输出:name@#163.com

11.         Response.Write(\\\"
\\\");

12.         Response.Write(Server.UrlEncode(\\\"name@#163.com\\\"));//对字符串进行URL编码,这里输出:name%40%23163.com

13.         Response.Write(\\\"
\\\");

14.         Response.Write(Server.UrlDecode(\\\"中文\\\"));//输出:中文

15.         Response.Write(\\\"
\\\");

16.         Response.Write(Server.UrlEncode(\\\"中文\\\"));//输出:%e4%b8%ad%e6%96%87

17.         Response.Write(\\\"
\\\");

18.         Response.Write(Server.UrlEncode(\\\"english\\\"));//输出:english

19.         Response.Write(\\\"
\\\");

20.         Response.Write(Server.UrlDecode(\\\"english\\\"));//输出:english

21.     }



来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/27710819/viewspace-1165821/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2014-04-24

  • 博文量
    6
  • 访问量
    17115