track back
我喜欢的Donews blog有TrackBack功能,就是不太会用。
创建TrackBack:在Donews blog里创建一个TrackBack不需要其它的工具,进入管理界面,进入统计/引用,就会看到你被引用过的文章,最后那个TrackBack栏目,都有一个创建的连接。点击进入创建界面,这里有三项你可以编辑的内容,标题、地址和评论/内容。这里的地址自动填写引用你文章的地址。
不过我很迷惑,不知道Donews blog的TrackBack有什么用?
创建的TrackBack是作为我自己的文章的评论显示的,只不过作者换成了Pingback/TrackBack,并且是引用你文章的地址的连接。我觉得自己的脑子不够使了,这有什么用啊?我加的TrackBack只能是自己文章的评论,最多有一个引用地址,可是这个引用地址从引用里面就能看到。
我需要的TrackBack是,我在我的blog上发的文章是在我朋友的blog上一篇文章的评论,可是该怎么做才能是这样的功能?
Donews blog应该有自己的FAQ。
1、WebLog百科全书中关于TrackBack的解释。
2、竹笋炒肉上的两篇相关文章:TrackBack新手指南(编译)和TrackBack技术规范。
3、Movable Type User Manual: TRACKBACK。
4、Debian HK的文章:Blog trackback 功能。
posted on 2004年07月03日 11:45 PM
TrackBack新手指南(编译)
TrackBack ping:在这种情况下,一个ping就是一条从一个web服务器发送到另一个服务器的短消息(a small message)。
"A Beginner's Guide to TrackBack"一文,对在MT中如何使用TrackBack做了详细地说明,下面就是学习笔记。
简单说来,TrackBack被设计用来提供一种方法以实现网站之间的互相通告:它是一种方法,能让甲对乙说(甲、乙指两个人,下同),"这篇文章可能是你感兴趣的"。要实现这个动作,甲向乙发送一个TrackBack ping即可。
TrackBack ping:在这种情况下,一个ping就是一条从一个web服务器发送到另一个服务器的短消息(a small message)。
TrackBack在2002年秋第一次以开放规范的形式发布。MT2.2作为一种协议和一项功能对其进行了实现,这是TrackBack的第一个实现。由于只有众多的站点都支持TrackBack,它的真正价值才能得以体现,所以TrackBack从一开始就被设计为一个开放系统:一个其它的blog工具能很简单地实现的开放系统。
截止目前,已有下列工具支持TrackBack:
TrackBack的使用依赖于具体的blog/trackback工具。下面主要针对MT的TrackBack使用。
小书签(bookmarklet)
在MT中使用TrackBack的最简单的方法,是借助小书签,它利用其自动发现功能可以从你正在阅读的当前页面中找到一组可进行TrackBack的文章链接。(自动发现意味着你无需做任何相关的工作,因为系统会替你完成)。如果你还没有在MT中设置过小书签,则:



,否则看不到这个链接。
当你阅读其它blog上感兴趣的文章时,点击"Post to MT Weblog",
如果当前页面中可以TrackBack的文章,它的标题将会自动加入到一个下拉列表中供选择来ping(如果只有一个满足要求的文章,则会用checkbox选项代替的下拉列表)。页面上显示其它元素,都是你在前面配置时选中的。如果那时所有项都选择了,则页面跟正常的"新增文章"非常相似。相关的项都输入完后,点击"保存"(post),则在重建立文章以后,系统会自动ping你从下拉列表中选中的那篇文章。
这儿有一个操作演示录像(9M大小),是mov格式,需要apple的QuickTime播放器播放。
通过文章编辑表单来TrackBack ping
如果你不想用小书签,仍可以在MT中使用TrackBack ping功能,只是不是那么简单而已。这时,需要找到被ping的目标文章的TrackBack Ping URL。下面描述一下如何一步步的操作。注意:TrackBack Ping Url不是文章的永久链接,而是另外一个链接。
当你阅读其它blog上感兴趣的文章时,点击"Post to MT Weblog",
如果当前页面中可以TrackBack的文章,它的标题将会自动加入到一个下拉列表中供选择来ping(如果只有一个满足要求的文章,则会用checkbox选项代替的下拉列表)。页面上显示其它元素,都是你在前面配置时选中的。如果那时所有项都选择了,则页面跟正常的"新增文章"非常相似。相关的项都输入完后,点击"保存"(post),则在重建立文章以后,系统会自动ping你从下拉列表中选中的那篇文章。

利用"自动发现"功能来发送"TrackBack Ping"
在MT中,最后一种使用"TrackBack Ping"的方法,是在你的blog设置中打开"自动发现(TrackBack auto-discovery,也有人译为自动挖掘)"选项。
当此选项打开后,MT利用自动发现在功能分析你的文章中的链接所对应的页面,是否接收"TrackBack Ping",如果接收,则自动从你的文章发送一个"TrackBack Ping"到那个页面。此时,你不需要在"Urls to Ping"输入框中输入内容,也不需要用小书签来查找可ping的链接。
TrackBack是一个基于REST的点对点(peer-to-peer)通信和网站间通告的架构。协议基于"推送(Push)"的原理,而不是"拉取(pull)":如果你想和其它站点分享信息,你要初始化连接,而不是等待其它站点发现你(和你的信息)。借助TrackBack,站点可以交流相关资源。例如,如果甲想通知乙他写了一些有意思的/想关的/震撼性的东东,甲发送一个TrackBack ping给乙。这完成了两件事:
TrackBack协议对任何blog工具都是开放的,具体规范参见http://www.infomall.cn/cgi-bin/mallgate/20040514/http://www.movabletype.org/docs/mttrackback.html, 或我的翻译.
远程评论
目前,TrackBack主要被用作一个远程评论系统:如果我在我的blog上发表了一篇文章来评价你在你的blog上的文章,我的blog工具会通报给你的blog工具以通知你此事。接着你的blog将显示我的文章的摘录部分,并提供了一个回到我的文章的链接。这使那些到你的网站的访问者知道其他人是如何评价你的文章的--换句话说,就是评论(comment)一样,只是这评论是在我的网站而不是在你的网站上,而在以前我只是在你的文章后留言评论。这让我能控制我的文章。如果我想修改一个打字错误,或者改变一些措词,于是我就可以做到。如果我在你的站点上留言,我没有权限来修改那些文字。换句话说,TrackBack使你更能控制你的内容。
TrackBack ping的威力,在于它创建了你我站间的一个直接引用。这个引用可以用来建立一个分布式的交谈(conversation)。例如,另外一个blogger(女)发布文章阐述了对我的文章的想法,并发送给我一个TrackBack ping.这个交谈(conversation)可从你最初的文章,追踪到我这儿,再到她那儿。这个线路可以通过TrackBack的元数据自动画出来。请看这个线路:http://www.infomall.cn/cgi-bin/mallgate/20040514/http://www.sixapart.com/safari-thread.html,它开始的文章是http://www.infomall.cn/cgi-bin/mallgate/20040514/http://www.sixapart.com/log/2003/01/initial_reactio.shtml.
内容聚合
虽然到目前TrackBack最流行的应用,是以远程评论的形式,一个更令人兴奋的使用已经开始出现了:利用TrackBack来将相关的内容聚合到一个基于主题的仓库(repository)中。这其实是TrackBack最初的设计用途:远程评论来源于一个主题仓库的特殊,即此时的"主题"是一篇blog文章。
内容聚合站点收集关于某个主题的内容。如果你曾试图查找关于某个特定题目的blog文章,这非常不可能,除非是新闻故事或新近发生的事。如果你的题目是关于80年代的音乐,你要花费更多艰苦的时间来找到所有的关于那个主题的blog文章。这到了TrackBack显示身手的时候:通过建立一个关于80年代音乐的文章仓库,其它的内容作者可以利用TrackBack自动ping这个仓库。任何查找关于80年代音乐的文章的人,可到这个页面,找到那些指向这个站点的文章。
这些内容仓库可以集中存放(如Internet Topic Exchange),也可以分布式存放。以MT为例,你可以设置任何blog分类来接收TrackBack ping,这使你成为你感兴趣的某个主题的信息源。

一些以这种方式使用TrackBack的站点:
内容控制
随着时间的流失,你在你的blog上的花费的时间越来越多,你的blog的内容也越来越充实,你可能想控制所有你在其它的blog或系统中发布的内容。例如,如果你曾就某人的文章在其站点上发布过自己的想法,他想将这些想法发布到自己的blog中来,于是你可就可控制它们了。或者,如果你在amazon.com上发表过评述(review),你可能想把这个评述组织到你的自己的站点中来。TrackBack有助于做到这些。有个例子,Matt Haughey的Posted Elsewhere工具条(http://a.wholelottanothing.org/),将他在别外写的内容聚合起来。
反过来,TrackBack可以工作:不是在别人的站点上发表文章,而是作者在自己的blog上发表文章,然后将TrackBack ping发往其它站点。例如,如果amazon.com评述可以接收TrackBack ping,你可信息控制在自己的网站上,让amazon.com连到你这儿。
一个页面,要想提高自己在google的pagerank值,关键在于能得到来自高pagerank值的页面的链接。一般说来,这种连接的建立,低值的页面只能被动的接收,而blog工具中的comments和trackback,提供了一种在别人的页面上主动建立连接的方法。如果google没有针对这种情况调整算法,这将成为一种快速提升pagerank的途径。尤其是"自动发现"功能,能自动找出链接,检查相关的页面是否接收trackback ping,将会更加剧对这种手段的利用。
真的是这样的吗?
参考资料
A Beginner's Guide to TrackBack
http://www.movabletype.org/trackback/beginners/
TrackBack ping:在这种情况下,一个ping就是一条从一个web服务器发送到另一个服务器的短消息(a small message)。
"A Beginner's Guide to TrackBack"一文,对在MT中如何使用TrackBack做了详细地说明,下面就是学习笔记。
TrackBack技术规范
mttrackback - TrackBack 技术规范
Benjamin and Mena Trott, movabletype.org
1.1
本文描述了TrackBack, 一个点对点通信和网站间互相通告的框架. TrackBack的中心思想是TrackBack ping的概念, 从本质上讲,TrackBack ping是一个请求,通告"资源A与资源B相关,或有链接到资源B." 一个TrackBack "资源" 用一个TrackBack Ping URL表示, 这是一个标准的URI.
利用TrackBack,站点间可以互相通告相关的资源. 例如,如果博客(weblogger)甲希望通知博客乙他写了一些有趣的/相关的/骇人听闻的文字,甲发送一个TrackBack ping给乙。这完成了两件事:
ping在他的文章和你的文章间提供了一种稳固的、直接的链接,而不是那种依赖于外部行为(某人点击那个连接)的非直接连接(如反向连接referrer)。
TrackBack使用REST(Representational State Transfer,http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm)模式工作, 请求通过标准的HTTP调用传送。要发送一个TrackBack ping, 客户端向服务器端发送一个标准的HTTP请求,然后接收一个简单XML格式的应答(详见下述).
在TrackBack系统中,接收TrackBack pings的URL叫TrackBack Ping URL.一个典型的TrackBack Ping URL如http://www.infomall.cn/cgi-bin/mallgate/20040514/http://www.foo.com/mt-tb.cgi/5, 其中5是TrackBack ID. 服务器端可以用任何有意义的格式来定义TrackBack Ping URL;客户端不应该只限于特定的格式.
为了发送一个ping, 客户端发送一个POST格式的HTTP请求到TrackBack Ping URL. 请求的内容的content type应是application/x-www-form-urlencoded. 例如, 到http://www.infomall.cn/cgi-bin/mallgate/20040514/http://www.foo.com/mt-tb.cgi/5 的ping请求可能看起来象:
POST http://www.foo.com/mt-tb.cgi/5 Content-Type: application/x-www-form-urlencoded title=Foo+Bar&url=http://www.bar.com/&excerpt=My+Excerpt&blog_name=Foo
注意: 在旧版本的TrackBack规范中,ping是用GET格式的HTTP请求发送的. 这种方式将不再支持; 2003年1月发布的Movable Type系统将会去掉对GET方式的支持。.
可能的参数包括:
在Movable Type系统中, 在上述的参数中只有 url 是必须的. 如果 title 没有提供,, url 的值将被用作标题.
对上述请求的应答信息,以XML格式编排,从而能实现应用层的错误检查。(HTTP层的错误将会这样返回--例如,如果TrackBack URL 所指的资源在服务器上已经不存在,状态码404 将会返回).
一个成功的ping将会返如下应答:
<?xml version="1.0" encoding="iso-8859-1"?> <response> <error>0</error> </response>
一个失败的ping将会返如下应答:
<?xml version="1.0" encoding="iso-8859-1"?> <response> <error>1</error> <message>The error message</message> </response>
当然,应用程序应该允许将来根据需要增加字段,但应答的 XML 结构保持不变.
要取回某个特定TrackBack Ping URL收到的ping,向它发一个GET格式的HTTP请求,请求字符串(query string)是 ?__mode=rss. 在规范的将来修订中,--一旦从POST转换到GET的过渡期结束--这将非常简单,向TrackBack Ping URL发送一个GET请求,将返回一列ping.
一个GET请求样例如下::
GET http://192.168.1.103/mt/mt-tb.cgi/3?__mode=rss
对此请求的应答,要么返回如上所述的错误信息,要么返回一列用RSS规范格式标志的TrackBack pings, 整个应答内容的覆巢无根元素是 <response> .
例如:
<?xml version="1.0" encoding="iso-8859-1"?> <response> <error>0</error> <rss version="0.91"><channel> <title>TrackBack Test</title> <link>http://this.is/the/trackback/item/link/</link> <description>Description of the TrackBack item</description> <language>en-us</language> <item> <title>TrackBack Demo</title> <link>http://this.is/the/permalink/</link> <description>Excerpt</description> </item> </channel> </rss></response>
在标签<rss> 和 </rss> 之间的部分,都是真实的RSS数据; 剩余的部分都是应答内容的包装,处理时可以忽略.
TrackBack客户端需要一种方法,来确实一个特定的URL或blog文章的TrackBack Ping URL. 服务器在生成页面时应内嵌RDF; RDF 描述关于该文章的元数据,允许客户端自动发现TrackBack Ping URL.
RDF样例如下::
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<rdf:Description
rdf:about="http://www.foo.com/archive.html#foo"
dc:identifer="http://www.foo.com/archive.html#foo"
dc:title="Foo Bar"
trackback:ping="http://www.foo.com/tb.cgi/5" />
</rdf:RDF>
注意: 由目前的检查器将嵌入XHTML页面的RDF信息视为不合规范,要通过检查需要将上述的RDF信息用注释符括起来:
<!-- <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" ... </rdf:RDF> -->
这不是一个完美的解决方案,但是作为一个临时的应对措施它可正常工作.
其中的dc: 元素是标准的Dublin Core 元素; trackback:ping元素来自RSS 1.0/2.0的TrackBack模块,参见http://www.infomall.cn/cgi-bin/mallgate/20040514/http://madskills.com/public/xml/rss/module/trackback/.
给定一个URL my_url, 客户按下列步聚来寻找TrackBack Ping URL:
客户端一旦确实了TrackBack Ping URL, 它就可以发送TrackBack ping了 (参见 发送 TrackBack Ping).
自动发现的代码样例参见 例子.
为帮助那些有远见的开发人员在他们的系统中实现 TrackBack , 我们发布了一个TrackBack的独立的实现,它不依赖于Movable Type系统. 它可接收通过HTTP请求发送来的ping, 将ping存放在本地的文件系统中, 且可以返回某个特定TrackBack项(文章)的一列RDF格式的ping. 如果你要求,它还可以静态地产生 RSS文件. 例如,要将最近的15个ping列在工具条,这项功能就会泒上用场。
这个独立的TrackBack实现可从http://www.infomall.cn/cgi-bin/mallgate/20040514/http://www.movabletype.org/downloads/tb-standalone.tar.gz下载.
它的发行遵循 Artistic License. Artistic License条款的描述在 http://www.infomall.cn/cgi-bin/mallgate/20040514/http://www.perl.com/language/misc/Artistic.html.
它的安装和使用指令说明在http://www.infomall.cn/cgi-bin/mallgate/20040514/http://www.movabletype.org/docs/tb-standalone.html.
use LWP::UserAgent;
sub discover_tb {
my $url = shift;
my $ua = LWP::UserAgent->new;
$ua->agent('TrackBack/1.0');
$ua->parse_head(0); ## So we don't need HTML::HeadParser
$ua->timeout(15);
## 1. Send a GET request to retrieve the page contents.
my $req = HTTP::Request->new(GET => $url);
my $res = $ua->request($req);
return unless $res->is_success;
## 2. Scan te page contents for embedded RDF.
my $c = $res->content;
(my $url_no_anchor = $url) =~ s/#.*$//;
my $item;
while ($c =~ m!(<rdf:RDF.*?</rdf:RDF>)!sg) {
my $rdf = $1;
my($perm_url) = $rdf =~ m!dc:identifier="([^"]+)"!;
next unless $perm_url eq $url || $perm_url eq $url_no_anchor;
## 3. Extract the trackback:ping value from the RDF.
## We look for 'trackback:ping', but fall back to 'about'
if ($rdf =~ m!trackback:ping="([^"]+)"!) {
return $1;
} elsif ($rdf =~ m!about="([^"]+)"!) {
return $1;
}
}
}
这段Perl定义了一个过程 discover_tb. 给定一个 URL, 它会试图找到与此URL相对应的TrackBack Ping URL. 如果找到了,它会返回 TrackBack Ping URL; 否则返回 undef.
规范首次发布.
感谢Paul Prescod和其他朋友,他们的指导让TrackBack更符合REST.
[Blog Basics] Comment and Trackback
http://www.azuremedia.net/tech/history/blog/000802.html
Comment與Trackback其實不是Blogging基本的東西,不過這兩者卻是Blog生命力的最大來源。
Blog源於Weblog,紀錄Blogger網上見聞。這點很多人都懂,因此Comment與Trackback根本就不是Blogging的基本組件。沒有Comment和Trackback,一樣可以是一種很好的紀錄。
如果你由幾年前開始使用Blogger.com的話,你就會發現這個Blogging界別的始祖在最初的版本就沒有這兩樣東西。要讓其他人留言,只有靠Haloscan等外掛的工具了。就算時至今日,Blogger.com也只有Comment而沒有Trackback。這也是不少人繼續使用Haloscan,而不使用Blogger.com所提供的Comment功能之原因。
筆者之所以說Comment與Trackback可以為Blog提供生命力,因為兩者都是Blog之中,具有互動性及社會性的部份。
Comment,大概也不用多作介紹了。反而不少人對Trackback感到陌生。Trackback在不少Blog上翻成引用。這翻譯算是不錯,但仍欠全面。事實上,當我們看了別人的Blog Post感到興趣,並Post相關的內容到自己的Blog時,你便可以用Trackback讓對方知道你引用了他的內容。因此,引用這個名稱就真的貼切不過。
不過,Trackback也有Comment的功能。比如我閱讀到別人的Blog上,刊登了接近自己Blog上某篇文章之內容,那我便可以用Trackback的功能,將自己的文章透過Trackback當Comment般Post到對方那文章上,好讓閱讀該文章的人可到訪我的Blog,繼續研讀同一課題的文章。對於Blog本身,Trackback就有如在站內加入延伸閱讀的內容;對讀者來說,也讓他們在一個課題中,得到更多的資料,視野自然拓闊不少。
正因為Trackback可作Comment相若的用途,所以不少Blogger將Comment同時列出來,讓人參考。亦因為Comment也有其參考與閱讀價值,所以不少人都將Comment輸出RSS Feed,讓讀者可透過News Reader閱讀。
ASP.NET的一些编程习惯
最佳ASP.NET编程习惯
初学编程的朋友往往喜欢收集一些很"奇妙"的编程技巧,然而,技巧的积累往往并没有提高程序质量,反而引导一些编程者一味追求奇和新,忘记了基本编程习惯的培养,不利于团队的合作,可能,这也是中国并不缺少聪明的程序员,但是缺少聪明的开发团队的一个原因吧。在ASP.NET的开发中,可以学习的技巧不少,但是,一些基本的编程习惯我们一定要养成,这样不但能根本上提高程序质量和开发效率,而且,也利于程序的阅读和团队开发。如果自己写的程序只有自己可以看懂或者只有几个人可以看懂,即使程序技巧神乎其技,对于程序的升级和维护都是致命问题。
一、 错误(以外)的处理
程序健壮性最基本要求就是程序错误的处理与捕捉,在ASP.NET中,错误的处理有和其他编程语言一样的机制,可以使用Try...Catch...Finally等方式,这一点和ASP相比具有较大的进步。而且,使用这些错误处理方法,可以大大提高程序的可读性和程序调试速度,在这几个优势结合的情况下,我们更加应该注意这一点。
关于错误的处理,我们可以参考这篇文章(英文):
http://www.123aspx.com/redir.aspx?res=28336
二、 字符串的处理
网页设计中,字符串的处理几乎是最常见的了。使用ASP.NET以后,字符串的处理比ASP的速度快,而且,在ASP.NET中,专门增加一个字符串处理类StringBulider,使用这个类可以完成一些常见的字符串操作,而最主要的,使用StringBuilder可以大大提高字符串处理速度。
在ASP.NET中,最常见的就是使用"&"来连接两个字符串:
Dim myOutputString As String = "My name is"
Dim myInputString As String = " Alex"
myOutputString = myOutputString & myInputString
Response.Write(myoutputString)
现在,我们来看看StringBuilder的使用,在使用StringBuilder的时候,我们对字符串可以做一些基本的操作,比如Append、Replace、Insert、Remove等,现在我们来看具体举例。
(1)StringBuilder中Append的使用
Append和其他语言的Append一样,就是在字符串最后增加其他字符。
Dim sb as StringBuilder = New StringBuilder()
sb.append( "<table border='1' width='80%'>" )
For i = 0 To RowCount - 1
sb.Append("<tr>")
For k = 0 To ColCount - 1
sb.Append("<td>")
sb.Append( dt.Rows(i).Item(k, DataRowVersion.Current).toString())
sb.Append( "</td>" )
Next
sb.Append("<tr>")
Next
sb.Append( "</table>")
Dim strOutput as String = sb.ToString()
lblCompany.Text = strOutput
在以上的程序中,用Append方法实现了一个表格的输出,需要注意的一点是,StringBulider必须首先使用ToString()方法将其转化为String类型才可以直接输出。在以上的举例中,我们看到的全部是Append一个直接的字符串,其实,这个方法有一个很方便的功能,那就是可以直接Append其他类型的变量,比如可以直接Appemd一个Integer类型的数值,当然,我们输出以后自动转化为一个字符串:
Sub Page_Load(Source As Object, E As EventArgs)
Dim sb As System.Text.StringBuilder
Dim varother As Integer
varother=9999 <
BR>sb =new System.Text.StringBuilder()
sb.append("<font color='blue'>可以Append其他类型:</font>")
sb.append(varother)
Response.write(sb.toString())
End Sub
(2)字符串中其他方法的使用
我们还可以使用其他方法,我们来看看常见的:
Insert方法,可以在指定位置插入其他字符,使用方法:Insert(插入位置,插入字符);
Remove方法,可以在指定位置删除指定字数字符,使用方法:Remove(其实位置,字符数);
Replace方法,可以替换指定字符,使用方法:replace(被替换字符串,替换字符串)
字符串的具体介绍和使用方法可以参考以下文章(英文):
http://aspfree.com/aspnet/stringbuilder.aspx
http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemTextStringBuilderClassTopic.asp
三、 数据库链接Connection和DataReader的关闭
在使用ASP编程的时候,我们就已经知道,在使用数据库连接以后,一定要将连接关闭,然后设置为NoThing。在Asp.NET中,我们仍然需要这样使用,不过,在ASP.NET中,由于使用了ADO.NET,所以,在一些相关的处理方面,实际还是有一些细微的区别,而这些区别,往往也就是我们设计的时候最需要注意的。现在,我们通过举例,来看看在常见的ADO.NET操作中,需要注意哪些问题。
(1)举例一
Dim myConnection As SqlConnection = new SqlConnection(ConfigurationSettings.AppSettings("DSN_pubs"))
Dim myCommand As SqlCommand = new SqlCommand("Select pub_id, pub_name From publishers", myConnection)
Dim myDataReader As SqlDataReader
Try
myConnection.Open()
myDataReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection)
DropDownList1.DataSource = myDataReader
DropDownList1.DataBind()
Catch myException As Exception
Response.Write("An error has occurred: " & myException.ToString())
Finally
If Not myDataReader Is Nothing Then
'关闭DataReader
myDataReader.Close()
End If
End Try
在以上的举例中,我们注意到,这里只关闭了DataReader,并没有关闭Connection。为什么呢?仔细观察以上的ExecuteReader方法,原来,设置了ExecuteReader参数,当执行完ExecuteReader以后,会自动关闭Connection。所以,这样设置以后,就没有必要再手动关闭Connection了。
(2)举例二
Dim myConnection As SqlConnection = new SqlConnection(ConfigurationSettings.AppSettings("DSN_pubs"))
Dim myCommand As SqlCommand = new SqlCommand("Select pub_id, pub_name From publishers", myConnection)
Try
myConnection.Open()
DropDownList1.DataSource = myCommand.ExecuteReader()
DropDownList1.DataBind()
Catch myException As Exception
Response.Write("An error has occurred: " & myException.ToString())
Finally
If Not myConnection Is Nothing AndAlso ((myConnection.State And ConnectionState.Open) = ConnectionState.Open) Then
myConnection.Close()
End If
End Try
在以上的举例中,我们发现,居然没有关闭DataReader。为什么呢?其实上面的代码中,没有直接生成DataReader对象,当然也就无从关闭了。需要注意一点的是,在关闭Connection之前,程序首先判断Connection是否已经打开,如果没有打开,也就没必要关闭了。
四、使用Web.Config/Maching.Config保存常用数据
一些数据我们需要时常使用,比如使用ADO.NET的时候,最常见的就是数据库连接语句,在ASP中,我们常常将这些信息保存在Application中。当然,在ASP.NET中,也可以这样,不过,ASP.NET已经提供一个配置文件WEB.Config,所以,我们最好将这些信息保存在WEB.Config中,当然,我们也可以保存在Machine.Config中,不过,这样的话,整个网站都必须使用,所以,一般我们都使用Web.Config。现在,我们来看具体这个文件的使用。
(1)Web.Config文件的设置
首先,我们来看Web.Config的设置,我们在这个文件中增加设置以下两个项目,设置如下:
<configuration>
<appsettings>
<add key="dsn" value="myserver"/>
<add key="someotherkey" value="somevalue"/>
</appsettings>
</configuration>
(2)变量的使用
以上XML文件设置了dsn和someotherkey两个变量,现在我们看看程序中怎样使用:
<html>
<script language="VB" runat=server>
Sub Page_Load(Sender as Object, E as EventArgs)
Dim AppSettings as Hashtable = Context.GetConfig("appsettings")
DSN.Text = AppSettings("dsn")
SomeOther.Text = AppSettings("someotherkey")
End Sub
</script>
<body>
DSN Setting: <asp:label id="DSN" runat=server/> <br>
Some Other Setting: <asp:label id="SomeOther" runat=server/>
</body>
</html>
上面的程序我们看到,使用这样定义的变量很简单也很方便。
五、使用.NET的方式调试程序
ASP程序的调试一直是编写ASP最难的地方,这一点,ASP程序员大概都深有体会,因为大家都是使用Response.write来调试。而这样调试最大的缺点是,当我们调试完毕,必须一个个来删除或者注释掉这些信息,想一想,如果程序代码达到几百行或者页面很多的程序,这样的工作是多么枯燥,最怕一点,忘记将这些调试用的write删除,可能在用户使用的时候就会出现一些不雅的调试信息。
使用ASP.NET以后,我们可以直接定义Trace来实现程序的调试。以上提到的麻烦可以轻松解决,熟悉,Trace可以通过具体页面和在Web.Config配置文件中来定义实现,这样,当程序调试完毕以后,直接将Trace设置为Off就可以了,这样,程序就不会有调试功能了。
(1)页面调试的实现
在一个具体的页面需要实现调试功能的时候,我们可以这样设置:
<%@ Page Language="VB" Trace="True" %>
(2)定义WEB.Config实现
在WEB.CONFIG中,我们也可以实现程序调试的打开:
<configuration>
<system.web>
<trace enabled="true" requestLimit="10" localOnly="false"/>
</system.web>
</configuration>
使用以上的设置打开Trace以后,我们在具体的程序中就可以使用Trace来调试程序了,比如:
Trace.Write("This is some custom debugging information")
或者调试程序变量:
Trace.Write("This is is my variable and it's value is:" & myVariable.ToString())
以上设置我们可以看出,在ASP.NET中,程序调试功能已经很方便简单了,我们在程序设计中如果忽略这些特点,继续采用ASP的思维来设计程序,那么我们的程序不但效率没有提高,也增加了其他开发者合作的难度。
六、总结
以上的一些程序编写习惯,我们可以慢慢养成,在程序设计的时候,不要太在意程序是否最简洁灵活,对于一般开发者而言,程序规范化和可读性可能比追求程序的灵活性更加重要。在互联网资源越来越丰富的情况下,我们可以参考一些很规范的程序源代码来学习,当然,最好的莫过于微软自己的东西,我们可以参考以下网址:http://www.asp.net
ASP.NET程序员需改掉ASP遗留的二十大陈旧习惯
在技术更新的进程中, 仍然有一些人死抱着已经过了气的东西不放. 也有一些人虽然进入到新的世界, 但仍摆脱不了陈旧的习惯. 我没有用"陋习"这个词, 因为我对这个词也非常反感.
新技术应该有新技术的 做法, 进入ASP.NET的世界, 就应该把以往的习惯改正, 全新的进入新的世界, 把ASP的破烂扔掉.
以下列举的都是错误的做法, 请不要误以为是推荐的做法而进行推广:
1. 使用server side include给ASPX引入共同的页面构图.
在ASP.NET的机制下, 应使用ASCX(web user control)来实现. ASCX提供了更多可控制接口. 并且更重要的是, ASCX是一个类. 一个实实在在的类. 可以全面控制它.
2.不使用web.config
web.config提供了非常丰富的配置管理接口. 是一个应用程序最核心的部分. 但是很多人的web.config往往是空的. 或者就从来没有修改过.
3.使用Response.Write向前端输出消息
ASP.NET平台下的Response和ASP的Response有很大的不同. 虽然表示同一含义, 但用法上已经大不相同. Response.Write的内容只会输出到页的最前端. 向前端输出消息的正确方法是使用PlaceHolder.
4.使用一系列session管理用户连接状态
这种方法在ASP里被滥用. 在ASP.NET环境下, 正确的做法应该是设计一个类. 结构化地保存数据. 将对session或者cookie的访问封装起来.
5.使用session验证身份
这几乎是通病. ASP.NET提供了一组用于用户身份验证的API. 类型是forms验证或者windows验证. 这一点quick start有一节讲解得很清楚. 可以绝大部分人还是依靠给session赋值来保持用户身份验证状态.
6.使用Response.Redirect重定向页
这一点在必要的时候可以使用. 但不可滥用. 事实证明滥用重定向将导致逻辑上的严重混乱. 这是在以页为程序单元的时候的做法. 使用front controller模式将使用户的操作逻辑集中起来
7.使用太多ASPX页
ASP环境下的程序单元只有*.asp页, ASP.NET可不是这样, 还有后端的类库, ASCX等等. 应将业务逻辑分别集中在不同的单元, 而不应该一项操作使用一个ASPX. 更多时候ASPX将做为ASCX或者custom control的容器而管理页内逻辑. ASPX重用ASCX的同时, ASPX也做为统一的页构图重用.
8.在多个逻辑单元之间复制代码并修改相应逻辑
重用. 重用. 重用. 处理此类问题的原则是不出现任何相同或相似的过程. 如果你用上面的方法, 一旦出现重大逻辑更改, 带来的结果将是灾难性的.
9.害怕使用DataSet.
很多人被DataSet吓坏了. 认为"肯定"影响性能. 但连最初的尝试都不敢. 他们总认为他们的产品一定重大, 设计上应该"慎重". 他们往往使用ArrayList或 者设计低级的类来保存集合数据. 进行艰难的数据倒入工作.
10.对"性能"过多注意.
对ASP.NET ViewState的机制特别不满. 或者总是挖空心思迫害人家. 反倒把自己弄得很累. 如果在对付ViewState的同时多注意少连几次数据库也许更文明些.
11.应用程序根目录很乱.
ASP.NET是开发项目. 不是网站. 应该把不同的资源分类放置. 例如把所有静态资源(样式表, 脚本, 图像)组织到一起. 甚至可以写一组API来管理他们. ASPX应该放在一起. ASCX应该放在一起. .*.cs呢? 应该把他们放到另外一个project里.
12.不厌其烦的写访问数据库的过程
应该把这工作交给DataAccess Application Block. 你自己还要开关connection, 何苦呢.
13.自己写的东西最靠得住.
事实往往正好相反. 多注意使用人家写好的产品. 又不收你钱, 何苦那么爱面子呢.
14. 胡乱命名ASPX文件名
这是最让人痛苦的了. ASPX文件名不仅需要容易识别. 还应该遵循一定规则. 因为behind每个ASPX都会有一个同名的类, 想象一下, 多难受. 另外大部分人不知道管理自己的项目的name space. 让人好像看到一本帐一样.
15.从来不作继承或派生
一些具有相同行为的类, 应该从公共的基类派生出来. 实际意义上, 我们的ASPX应该有一个基类PageBase. 因为总有一些公共的特性需要抽象出来.
16.零property
他们的类(ASPX所对应)里只有private method. 不公开自己的任何秘密. 可以这一定是JAVA的遗老干的事.
17. 零ASCX
不用说, 他还没学会ASP.NET
18.使用DreamWeaver"画"ASPX
这批人是美工. 甚至有一些人在非常陶醉地讨论如何更好地"整合" DreamWeaver和Visual Studio.
19.只熟悉System.Web.UI.WebControl和System.Data.SqlClient应该还有一些值得熟悉的类库.
20.零注释
这些都是心里很明白的快手. 一任IDE生成的缺省注释横在那里不管.
21.零事件
对"事件驱动"一无所知. 只知道在Page_Load()里写过程. 或者双击一个按钮写Xxx_Clock()过程. 在他们的程序里看不到event和delegate.
在技术更新的进程中, 仍然有一些人死抱着已经过了气的东西不放. 也有一些人虽然进入到新的世界, 但仍摆脱不了陈旧的习惯. 我没有用"陋习"这个词, 因为我对这个词也非常反感.
新技术应该有新技术的 做法, 进入ASP.NET的世界, 就应该把以往的习惯改正, 全新的进入新的世界, 把ASP的破烂扔掉.
以下列举的都是错误的做法, 请不要误以为是推荐的做法而进行推广: