认识Microsoft公司的Asp.net有一段时间了,感觉asp.net确实在功能方面和性能方面比asp有了很大的改进(之前,我一直在写asp程序),并总结了一些内容,这里和大家分享一下。由于笔者经验很少,所以文中有在技术上的错误或者需要改进的地方,欢迎和我交流。
由于个人比较喜欢使用C#语言,所以例子里大多都是用C#示例的,但是这里主要是阐述一些原理性的东西,所以没有过多的依赖于具体的语言,如果你比较偏向于VB可以参考下面这篇文章来暂时转换一下自己的思想:
代码换肤术——C#和VB
http://blog.csdn.net/onlytiancai/archive/2004/07/16/43137.aspx
vb.net和c#语法比较
http://blog.csdn.net/onlytiancai/archive/2004/07/16/43134.aspx
我想从以下几方面谈谈我的体会,主要想写一下从安全和性能方面考虑的一些抉择问题
1.web用户控件,web自定义控件,后台编码类,.net组件的使用场合:
2.缓存(CACHE和APPLICATION)的使用场合:
3.web服务和组件类的使用场合:
4.vb.net和C#的使用场合:
5.DataReader和DataSet的使用场合:
6.数据库和xml数据的使用场合:
7.字符串连接符和stringBuilder的使用场合.
8.基于windows和基于form身份验证的使用场合.
9.静态方法和非静态方法的使用.
10.HTML控件和服务器控件的使用场合.
11.客户端技术技术和服务端技术的使用场合.
12.DTD和Schema的使用场合
13.字符串处理函数和正则表达式的使用场合.
14.web服务的同步条用和异补调用的使用场合
15.实例化类和继承类的使用场合
16.单值绑定和多值绑定的使用场合
1. web用户控件,web自定义控件(自定义服务器控件),后台编码类,.net组件(程序集)的使用场合:
这几种技术都是用来复用代码的,但是使用的场合有所不同,下面我会尽力说明它们各自之间的不同以及之间的联系。
先来看一下web用户控件和web自定义控件的特点:
Web用户控件
Web自定义控件
web用户控件容易创建,
web自定义控件难于创建,
只能为使用可视化设计工具的使用者提供有限的支持
为使用者提供完全的可视化设计工具支持
每个应用程序中需要控件的一个单独副本
仅在全局程序集缓存中需要控件的单个副本
不能添加到Visual Studio 中的工具箱
可以添加到 Visual Studio 中的工具箱
适用于静态布局
,适用于动态布局.
综上可以看出,web用户控件适用于:
1.页面上复用的元素,如标题,产品目录,菜单,注册控件等。
2.利用用户控件的高速缓存功能,高速缓存常常浏览的页面,可以提高页面的性能。
3.把重复的页面元素封装到用户控件里,减少了每个页面上的代码量
但是,如果要创建一个比自己所在的应用程序更广泛的复用的控件时候,就需要考虑使用web自定义控件了.
如果你安装有MSDN,关于使用web用户控件和web自定义控件的建议可以参考下面的链接。
ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/vbcon/html/vbconwebusercontrolsvscustomwebcontrols.htm
举个例子来说明怎样建立用户控件:
Hello, 我是蛙蛙
把上面的代码保存为wawaUC.ascx这个用户控件就建好了。(调用用户控件的时候需要指定这个地址)
下面举个例子来说明怎样缓存用户控件。编写好控件后在.ascx文件的最上面加上下面一句就可以实现控件的高速缓存(碎片缓存)了。
把用户经常访问但不经常更新的数据做成用户控件并高速缓存起来,而一些实时的信息不要缓存,这样就可以提高页面整体的性能,而不至于让一些实时的信息不能及时的更新。
简单解释一下OutputCache的几个参数,这个标记在.aspx和.ascx中都可以使用
OutputCache:使用高速缓存。
Duration:指定高速缓存内容的时间,单位时秒
Location: 设置为Server时只在服务器使用缓存,设置为Downstream时中间的网络代理也可以高速缓存页面的副本,设置为Client表示浏览器可以高速缓存页面,设置为Any时表示这些高速缓存都可以使用
VaryByControl:允许高速缓存页面上的控件,这个标志时在.aspx页上使用的。
VaryByParam:根据POST传递参数来形成不同版本的缓存,想在任何时候都高速缓存整个页面可以把值设置为none,如果希望所有的参数使用不同版本的缓存可以把参数设置为*。
VaryByCustom:根据不同版本的浏览器形成不同版本的缓存,或者用指定的字符串来形成不同版本的缓存,设置为
browser就可以为不同版本的浏览器使用不同版本的缓存,这在不同的浏览器或设备上显示数据是很有用。
VaryByHeader:根据不同的http头形成不同的缓存。
自定义服务器控件可以在不同的应用程序之间重用代码,你可以从头开始用html来建立自定义控件,也可以在现有的服务器控件建立自定义控件(一般把这样的控件称做合成控件)。举个例子来说明怎样建立自定义服务器控件:
using System;
using System.Web.UI;
namespace wawaControls
{
public class helloControl : Control
{
protected override void Render (HtmlTextWriter writer)
{
writer.Write(“ hello,蛙蛙”);
}
}
}
从中可以看出,自定义的用户控件继承自System.Web.UI. Control ,并重写了Control类的Render方法来改变了Control类的默认输出,然后用HtmlTextWriter控件又可以输出任意的Html代码和脚本代码,这样以来任意复杂的自定义控件了。
把上面的代码保存为MyCustomControl.cs
写好代码后需要编译成.dll文件,用.net框架自带的CSC命令工具来完成,先写个批处理文件,如下:
Set assemblies=System.dll,System.Web.dll
csc /t:library /out: MyCustomControl.dll MyCustomControl.cs /r:%assemblies%
pause
简单介绍一下csc命令的使用参数:
/t表示输出类型,这里用library,表示输出为.dll文件,此外还可以是exe(控制台程序),winexe(windwos程序)等,/out表示你要输出的文件名,紧跟其后的是你要编译的文件名,/r表示你需要把那些文件编译入到要生成的文件中,这里是用set命令先把System.dll,System.Web.dll定义了一个变量然直接使用的,最后用一个pause命令暂停输出。注意,set和pause是系统的控制台(cmd)命令,它源自与古老的DOS。把上面的代码保存为一个.bat批处理文件,双机运行就可以生成.dll文件了,最后把这个文件放入bin目录备用。
在使用用户控件和自定义控件时,有些不同。
用户控件调用示例如下:首先在需要调用控件的开头输入下面的代码。
然后在合适的位置用类似下面的代码来调用:
注意上面的代码要放在服务器控件Form容器里。
简单介绍一下Register的各个参数的说明。
TagPrefix:控件组的集合名,就是调用控件是冒号前面的部分
TagName:控件的名称,就是调用控件是冒号后面的部分
Src:控件的源文件地址
Namespace:控件的命名控件(用于服务器控件)
Assembly:控件集合(用户服务器控件)
自定义控件调用示例如下:首先在需要调用控件的开头输入下面的代码。
然后在合适的位置用类似下面的代码来调用:
关于创建用户控件的详细方法可以参考下面地址:
ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/vbcon/html/vbwlkwalkthroughcreatingwebusercontrols.htm
关于创建自定义控件的详细方法可以参考下面地址:
ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/vbcon/html/vbwlkwalkthroughcreatingcustomwebcontrols.htm
我们都知道在asp程序设计中,用户接口层的html代码和业务逻辑层的代码是穿插在一起的,为了改变这种情况,asp.net引入了一种后台编码技术(CodeBehind),可以把用于显示的html与业务逻辑代码块分离开来.这样可以把实现业务逻辑的代码单独存放在一个.vb或者.cs格式的文件中,然后在前台的.aspx中使用后台编码类的成员.
简单说一下后台编码类的使用:
如果你把后台的编码保存为一个wawa.cs文件,在文件中定义了一个class_wawa的类,前台的显示文件叫wawa.aspx
可以在wawa.aspx文件的开头写入以下语句,来使用后台的wawa.cs文件的内容。
? Page language="c#" ?Src="wawa.cs" ?AutoEventWireup="true" ?Inherits="class_wawa" %
简单解释一下Page可以使用的几个函数
Page:设置页面元素。
Language:设置页面所使用的脚本语言,可以是C#,vb,等
Src:指定后台编码文件的路径和文件名,在vs.net里这个参数用CodeBehind参数代替。
AutoEventWireup:设置是否自动激活Page的事件,如果使用vs.net这里设置为False,因为vs.net自己管理页面的事件,如果自己编写的话,可以设置为True。
Inherits:设置本页继承的类,也就是可以使用这个指定类了的成员。
讲完了用户控件,自定义控件和后台编码类的应用,我们来看一下程序集的使用,程序集也是一种常用的代码复用技术,也有人叫做.net组件,它可以用vb.net或者c#来编写,写好后编译称.dll文件,放到应用程序目录的BIN目录下,这样在编写程序的时候就可以重用这个.NET组件的业务逻辑了,因为它已经编译称.DLL文件,所以无论它是vb.net编写还是用C#编写,或者用其它语言所编写,这都已经不再重要,这样一个开发团队的配合就会更加默契,因为他们不用为了所喜爱的语言的不同而加长开发的进度,而可以把自己的业务逻辑写称组件让别人来使用。
如果程序集不在bin目录下,可以通过修改web.config文件来加载其它目录下的程序集体,也可以加载GAC中的程序集,如果这几个地方都没有发现你所要调用的程序集那就会发生错误了。
namespace wawaComponents {
public class wawa_HelloCS {
public string SayHello() {
return "Hello 呱呱";
}
}
}
编译过程请参考上面自定义服务器控件的讨论部分,这里不再重复。
使用程序集的时候首先要导入组件的命名空间,实例化组件定义的类,然后就可以使用这个类中定义好的方法了:
……
using wawaComponents;
…..
l HelloCS CSComponent = new wawa_HelloCS();
label1.Text = CSComponent.SayHello();
除了以上讨论的几种复用代码的方式外,用类的继承和web服务也可以实现重用代码,其中用继承可以继承父类的成员,并可以根据需要重写或者隐藏父类的方法和属性,这是面向对象编程中最普遍的一种复用代码的方法。Web服务是近几年来很火的一种技术,因为它可以远程重用别人的业务逻辑,这样就给一些公司销售自己的商务数据,业务逻辑提供了新的方法,它是基于xml的,由于它是原创调用,所以在性能上会有些损失,不过幸运的是可以用异步调用和cache等技术来缓解这个问题。由于继承和web服务内容比较多,所以我会在后面的讨论中详细讨论它们。