技术话题
如果你已经看过我们前面的那些文章, 您有可能已经形成了这样一个想法:.NET是微软公司非常重要的战略措施,微软公司正在花费大量的时间和精力努力营建它。其中,.NET的一个不可缺少的部分是ASP.NET。现在,我们来谈一谈ASP.NET的体系结构,看看它是如何与.NET的整体架构协调工作的,以及如何利用ASP.NET开发大型网站那样的东西。
我们已经做ASP.NET三年了。我们刚开始主要是研究ASP。众所周知,ASP是个建立网络应用非常成功的平台,我们研究ASP主要看看它有些什么东西的确很值得保留,看看在哪些方面,我们可以改进它,于是我们花了一年半的时间进行头脑风暴式的集体研讨,产生想法并开始建设,这样就产生了ASP.NET。此外,我们最近将ASP+的名字改为ASP.NET。
请问,你们这样做的确切原因是什么?这样做又意味着什么?
.NET的起因是多方面的,比如将软件提升为服务;比如XML和web服务,他们用他们可做到的方式增强了互联网的性能。我们称之为 ASP+的东西是在我们有.NET之前被命名的;一旦.NET名字出来,我们就将它的名字和.NET架构紧密联系在一起了。我们可以这么认为,它是ASP的新版本,并且紧紧地依赖于我们谈论的.NET构架的所有东西。准确地说是这样的。
但是,我们认为关于ASP.NET重要的是,它并不是我们拿了来自ASP先前的版本的代码,将它移植到.NET上,或者与.NET相结合。我们真正从底层创建了它。这是一种彻底不同的代码,这是在我们花费3年时间所提出新想法的基础上,是在common language runtime基础上,是在XML基础上,是在所有其它.NET技术的基础上构建的。
我们在上面讨论了ASP新的构架,并且命名为ASP.NET,还重新建造了它,这难道意味着如果我是一名ASP程序员,我必须抛弃我学习过的一切,为了适应ASP.NET,必须重新学习一种新思路吗?
绝对不是的。如果你是一名ASP开发者,你仍然可以保持你目前的全部技能,并且非常轻易地将它们应用到ASP.NET中。如果你想继续按照你原来的风格写,你可以继续使用。如果你想接受最新的编程方式,你可以开始这种体验。不过,你可以渐渐地做到这一点,你可能会在许多新的特点中使用很多老的编码风格,并且获得这两种风格的最佳优点。
嗷,有那些新的特点吸引我前往ASP.NET,为什么我应该向ASP.NET模式转移?
有大量的新特点。
第一,现在全部的语言都是可以编译的语言。这是,很多ASP用户渴望得到的事情。他们希望在VB script中得到VB 的这种特征。现在你可以用纯粹的Visual Basic语言来编写你的ASP。NET程序。你也可以选择许多其他的语言,象C或者JAVA SCRIPT甚至COBOL, 我们已经证明COBOL可以运行在ASP内部,你可以使用这些更好的语言。你也可以拥有更加简明和强大的页面开发工具。因此,你可以利用很多的方法将对象行为变成TAGS,这样,你能仅仅把TAGS放在你的页面上就可以实现很多行为;
第二,你可以不必写很多的代码。我们做很多试验,约400行的ASP代码我们把它减少到了20行代码。这样,可以提高工作效率,创造的更多的价值。
另外,从创建你的网站并且使它能被其他的计算机自动访问这个角度看, web服务也是一个重要的新特点。例如一个以XML为基础的web服务的例子,它可以把不同的种类的信息连结到一起,就像电视节目列表。商务公司在用这种方式其他的商务公司交流信息。所以,能轻松地制作这些基于XML的服务是ASP.NET的另一个重要的部分。
不是SOAP也在提供同样的事情吗?
是的,但是,ASP.NET提供了一种非常简单的方法,建立了基于SOAP的WEB服务。
啊,我知道了。SOAP的一个方面是将你的页面那些告诉你你的过程所涉及的属性、方法、事件等小提示包装起来。因此,ASP.NET在页面上可以自动完成这些事情。
ASP.NET从根本上提供给这样一种自动化的方法,你用它建造的不是页面,:你实际上用它建造的是有独立的文件扩展名的WEB服务。在这样的页面里面,你实际上能定义使网站被调用的方法,你需要做的一切只是在页面里写你的代码,点击保存。并且,如果你用浏览器点击那个方法,你将实际上得到所有可以调用的方法的全部列表,以及一个如何通过SOAP调用它的方法的描述。你既可以用标准的查询字符串调用那些方法,也可以动态的创建一个com代理对象, 使网络通信全部自动化,包括全部http调用,以及XML集合,使用SOAP调用这个服务就像你调用一个储存在服务器里的对象的常规方法.
就像ASP的产生使得编写动态的网页的工作变得轻而易举所用的方法相同,ASP.NET的产生真的使写动态的WEB服务变得轻而易举。而实现这一功能,你只需要认真考虑你想写的代码和你想处理的数据。你根本不必想到XML。(当然,如果你想考虑XML,你能考虑XML。)
你可以写一个提供类别名字的方法,我可以用它来查询我的库存数据库,以及我的其他信息:我的生意怎么样了,我有多少库存,我将返还给你一个那个类别的所有产品列表;比如,如果我是食品杂货商店你向我询问牛奶的信息,我将给你我卖的牛奶的全部不同的种类信息。
你在ASP+中做这件事(当然,他真的意思是想说ASP.NET)的方法是:你仅仅用VB, C#编写一个类,该类有一个方法比如说取得类别,并且他还包含类别名字。接下来,它能进行查询SQL SERVER数据库或任何XML数据源,把数据带回。这个过程实际上不必认真考虑转换成XML这些事情。ASP.NET会自动完成XML的转换工作。
因此,我们能够自动地将一个xml payload转换成一个整数。然后,如果你返回一个records set的时候,我们将自动地处理records set,并将他变成XML数据流。因此,在ASP中不得不做的那些事情:手工分析XML,手工将HTTP的内容转换成对 XML payload的访问并分析他,这些过程都被自动的完成了。我们在其中提供动态的维护contract能力。Contract主要用来解释如何调用web service 的。因此你可以很容易的传递这个contract到其他站点上了,其他站点也可以直接对你的站点进行编程。
我们的网站作了一个很有趣的例子,提供了一系列的调用ASP+(即ASP.NET)的例子,他们提供的web service是:允许其他ASP.NET站点列举这个站点在某一天写的所有新的例子。因此那些站点可以订阅这些服务,并且可以对这些web service编程,规定他们是一天一次还是一个小时一次获取网站更新的那些例子的链接列表。
这样说来,对于用户来讲,他们没有必要考虑与浏览器或者web页面打交道的这些事情,他们直接通过web service就可以访问互联网了?
是的,但是那将是web service的美好的远景,那时我们将会认识到,互联网实际上是所有信息的总和。我们曾经为了便于人们浏览提供了在浏览器中显示html的方式,但是如果您的合作伙伴或者您公司的其他工作人员的一些进程或者程序需要调用这些信息时候,目前的技术实在是在无能为力的。XML技术的产生使得人们随心所欲表现任何数据成为可能。因此,你可以利用xml创建更多的web service,以便人们可以用多种方式调用程序或者交换数据。Xml的确是一件强有力的工具,他也可以帮助人们构建更多种类的应用程序。Xml技术也给客户提供了更多的帮助,由于他们同样可以获得数据和信息,所以他们可以做更多的事情。
由于有了以上这些技术,你不一定非要从客户端基于浏览器的应用程序中调用WEB服务。你还可以在一个普通的VB或者C#应用程序中使用WEB服务。
这些都不是什么问题。当然,这里面还有一个问题应该强调一下。我们所使用的SOAP和XML都是开放式协议标准。这些标准不是WINDOWS系统独有的,他们现在已经被许多家生产厂家所推崇。所以我们可以和UNIX系统,可以和基于JAVA 的系统交流,无论是发送信息还是接受信息,我们都可以用这种方式来交换信息,而不必考虑那台机器上是否安装了ASP.NET系统。如果真的会这样,你将会看见遍及互联网的应用程序用他们感兴趣的方式开始了互联。我们使用这些新技术的结果是,那些富客户端的应用程序会渐渐被人们遗忘的。
当然从另一个方面来看,尽管ASP.NET和.NET框架的主要目标是启动任何一种类型设备上的应用程序,但这并不意味着这些设备必须运行在.NET框架上。在ASP.NET平台上,我们已经作了许多直接支持WML这样协议的事情。因此,你可以直接开发出与较小的设备,例如与WAP PHONE或者其他可以处理HTML的小设备通信的应用程序。
因此,你用一个简单的AST.NET页面,可以指向许多类型的设备。这些设备可能具有完全不一样的特征。
是的。
这么说,是ASP.NET代码确定了如何到一个小设备或者大设备这样的事情吗?
是这样的。我们有一套特殊的服务器控件,我们称他们为MOBILE CONTROL,他们可以根据设备的类型,自动地发送WML,HDML或者HTML信息,譬如说如果你有一个爱立信的手机,他可能只有4、5行显示文字的区域,如果你调用的一个页面时,我们可以自动地根据这个设备的情况提供合适的显示方式。
这是否意味着开发人员不得不考虑他们所遇到的所有不同的情况,例如,这是个彩色的浏览器那是一个POCKET PC的显示界面。
不会的。这实际上就是ASP.NET最迷人的部分。通过这些服务器控件,你实际上找到了一条包含你所想象的不同行为方式或者对不同类型设备的不同输出的最好的解决问题的办法。我们可以在许多不同的情况下实现这些事情。例如,我们有一套控件是用来作确认工作的,确认的工作是一个站点中非常复杂的工作。特别是当你想生成客户端的代码,并且由这些代码来做确认的工作的时候,你会遇到很多麻烦的。现在,我们这套控件自动地为你做这些事情。它们包含了最基本的确认行为。对于富浏览器端的程序,他们将发送一种东西,他们将发送SCRIPT 代码,对于服务器端的程序他们也将履行确认这个过程,并产生相同的结果。只不过这里这时的主要工作是在服务器端进行。
服务器端控件自动的处理客户是有意按照客户端脚本运行还是故意不按照客户端脚本运行等情况,并且可以很好地控制这一切。你所做的只是在你的页面中宣布这些控件为TAGS,然后写上2,3行借用他们处理的代码,你便拥有了一个完整的确认页面了。
你说的只是一些基本的确认,他们支持对数字的确认吗?
是的,有一系列的东西我们支持。我们支持电话号码、邮政编码等相关的东西。我们会遇到很多的问题,有时候要确认添入的东西是不是数字,有时候他们添入的数字要匹配一些规则的表达式,有时候添入的数字要满足一定的界限的限制。
这些要求是可扩展的,我们由第三方厂家来从事这方面的工作。其中,第三方厂家做的一项工作是关于邮政编码的确认。你可以在一个页面的文本框里面使用这种确认,他将判断你输入的数字是否是一个有效的邮政编码,因此你可以在许多不同的场合使用这些确认功能,他们可以使您更容易编写页面程序。
实际上,完全组件化的系统允许开发人员和第三方的工作人员几乎在系统的任何一个层面插入他们的代码,这是我们一个最大的革新措施。我们常听见使用ASP的那些开发人员说过的一件事情:我喜欢ASP,我很喜欢Session State这样的东西,但是我希望他可以工作在WEB FARM上。例如他们会问,我如何使得他工作在WEB FARM 上?答案是,在ASP的环境中那是不可能的。但是在ASP.NET中,我们可以使得Session State工作在WEB FARM中,因此你可以尽情的使用了。此外,如果你想完全取代Session State你也可以做到;你想修改缓存输出的方法,你也可以轻松做到,因为整个系统是组件化的。如果还有人提出,尽管我们的喜欢response 、 request、session以及与他们相关的这些应用,但是我还想在ISAPI这个层面做更多的工作。我应该如何去实现呢?答案是,在ASP中没有办法实现,因为所有的事情都封装在ASP系统中。没有办法达到这么低的级别中,但是,如果你采用ASP.NET的话,由于它是组件构架的系统模型,所以你可以做你想做的事情。
嗷,在你提及ISAPI的时候,我想起了在ISAPI应用中有两种完全不同的模式:ISAPI应用模式和ISAPI过滤器模式,ASP.NET是否支持这两种不同模式?
是的,他支持这两种不同的模式。
……