月度归档:2005年11月

恢复IIS的ASP.NET支持

本地的IIS不知道怎么不能支持ASP.NET了,用VS.NET 2003创建一个新的Web Application 就说IIS不支持ASP.NET。
使用aspnet_regiis -i -enable恢复了。

下面摘自http://www.163er.com/zz/Server/Windows/6159.shtml:

使用 Aspnet_regiis.exe 修复 ASP.NET 的 IIS 映射

从“开始”菜单,单击“运行”。
在“运行”对话框中的“打开”框中,键入 cmd,然后单击“确定”。
在新窗口中的命令提示符下,键入以下行:
“%systemroot%\Microsoft.NET\Framework\version\aspnet_regiis.exe” –i。

在该路径中,version 表示安装在服务器上的 .NET Framework 的版本号。在键入命令时,必须用实际的版本号去代替这个占位符。

注意 在该命令中必须包含引号。

有关 Aspnet_regiis.exe 的详细信息,请以 -? 作为参数重复步骤 3 或参阅 ASP.NET IIS 注册工具 (Aspnet_regiis.exe)。

另外,在 Windows Server 2003 上,如果从 Web 下载或通过 Visual Studio .NET 安装了 .NET Framework 和 ASP.NET,则必须从 IIS 管理器中手动启用 ASP.NET。详细信息,请参阅安装 ASP.NET。

注意 如果要在域控制器上安装 ASP.NET,您必须采取特殊的步骤来使安装正常进行。详细信息,请参阅位于 http://support.microsoft.com 的 Microsoft 知识库中的文章 CHS315158:“ASP.NET 在域控制器上不能使用默认 ASPNET 帐户”。

ASP.NET IIS 注册工具 (Aspnet_regiis.exe)
当您在单个计算机上并行执行多个版本的 .NET Framework 时,脚本映射到 ASP.NET 应用程序的 ASP.NET ISAPI 版本将确定该应用程序使用的公共语言运行库版本。ASP.NET IIS 注册工具 (Aspnet_regiis.exe) 允许管理员或安装程序很容易地更新 ASP.NET 应用程序的脚本映射,以便指向与工具相关的 ASP.NET ISAPI 版本。此工具还可以用于显示所有已安装的 ASP 版本的状态。NET 注册与工具配对的 ASP.NET 版本,创建客户端脚本目录,并执行其他配置操作。

Aspnet_regiis [options]
您可以指定下列一个或多个选项。

选项 描述
-c 将 ASP.NET 的客户端脚本(如客户端的验证脚本)安装到每个 IIS 站点目录的 aspnet_client 子目录中。
注意 仅安装与 Aspnet_regiis.exe 相关的 ASP.NET 版本的客户端脚本。

-e 从每个 IIS 站点目录中的 aspnet_client 子目录中删除 ASP.NET 的客户端脚本。
注意 仅删除与 Aspnet_regiis.exe 相关的 ASP.NET 版本的客户端脚本。

-ea 从每个 IIS 站点目录的 Aspnet_client 子目录中删除所有 ASP.NET 版本的客户端脚本。
-i 安装与 Aspnet_regiis.exe 相关的 ASP.NET 版本,并更新 IIS 配置数据库根及其下的脚本映射。
注意 仅更新使用早期 ASP.NET 版本的应用程序的脚本映射。使用后续版本的应用程序不受影响。

-ir 安装与 Aspnet_regiis.exe 相关的 ASP.NET 版本并仅在 IIS 中注册 ASP.NET。
注意 此选项不会更新脚本映射。要安装 ASP.NET 并更新脚本映射,请使用 -i 选项。

-k path 从所有 ASP.NET 应用程序中将脚本映射删除到所有 ASP.NET 版本中,这些 ASP.NET 应用程序位于所指定的应用程序的根路径及其子目录中。
-kn path 仅从所指定的应用程序根路径中的 ASP.NET 应用程序中将脚本映射删除到 ASP.NET 版本中。
注意 该选项不影响 path 子目录中的应用程序。

-lk 列出 ASP.NET 脚本映射的路径和所有 IIS 配置数据库项的版本。
注意 从父项继承 ASP.NET 脚本映射的项不会显示。

-lv 列出在计算机上安装的所有 ASP.NET 版本的状态和安装路径。
-r 更新 IIS 配置数据库中及其下的所有脚本映射,以便将其指向与 Aspnet_regiis.exe 相关的 ASP.NET ISAPI 版本。
注意 除当前版本外,所有现有脚本都将更新到指向与 Aspnet_regiis.exe 相关的 ASP.NET ISAPI 版本。

-s path 将指向与 Aspnet_regiis.exe 关联的 ASP.NET ISAPI 版本的脚本映射安装到所指定的应用程序的根路径及其子目录处的所有 ASP.NET 应用程序中。所有在指定路径和其下面使用 ASP.NET ISAPI 版本的现有脚本映射都会更新。
-sn path 将指向与 Aspnet_regiis.exe 关联的 ASP.NET ISAPI 版本的脚本映射安装到所指定的应用程序根路径处的 ASP.NET 应用程序中。所有在指定路径中使用 ASP.NET ISAPI 早期版本的现存脚本映射都会更新。
注意 该选项不影响 path 子目录中的应用程序。

-u 从计算机中卸载与 Aspnet_regiis.exe 相关联的 ASP.NET 版本。此 ASP.NET ISAPI 版本的现有脚本映射会自动重新映射到所安装的最高的剩余 ASP.NET ISAPI 版本中。
-ua 从计算机中卸载全部 ASP.NET 版本。
-? 显示工具的选项和命令语法。

注释
当计算机中安装了多个版本的 ASP.NET 时,ASP.NET 会并行地运行。在此安装过程中,Internet 信息服务 (IIS) 需要知道应在 ASP.NET 中处理页的 ASP.NET ISAPI (aspnet_isapi.dll) 版本。与 ASP.NET 应用程序相关联的 ASP.NET ISAPI 版本将确定用于该应用程序的公共语言运行库。ASP.NET 应用程序通过 IIS 中的脚本映射与 ASP.NET ISAPI 版本相关联。要简化 ASP.NET 应用程序的配置过程,每个 ASP.NET 版本应该包括链接的 Aspnet_regiis.exe 版本。

注意 每个版本的 .NET Framework 都包含唯一的 Aspnet_regiis.exe 版本。因为工具的每个版本仅能应用于与其相关联的 .NET Framework 版本,所以请使用该版本的适当工具来配置 ASP.NET 应用程序。

Aspnet_regiis.exe 通常与 -s 或 -sn 选项一起使用,以将 ASP.NET 应用程序重新映射到与工具相关联的 .NET Framework 版本中。请使用 -s 选项更新在指定路径和它们所有子目录中的应用程序。如果不想更新子目录中的应用程序,请使用 -sn 选项。要立即更新计算机中所有现有 ASP.NET 应用程序的脚本映射,请使用 -r 选项。

注意 path 参数引用的是应用程序的根路径,而不是物理路径。例如,W3SVC/1/ROOT/SampleApp1。

相反,您可以使用此工具从使用 -k 或 -kn 选项的任何 ASP.NET 版本中删除脚本映射,并指定应用程序的根路径。

注意 如果指定的根路径从父根路径中继承了其脚本映射,则 -k 和 -kn 选项不起作用。

该工具也可用来安装或卸载链接的 ASP.NET 版本。请使用 -i 选项安装 ASP.NET 并更新所有现有 ASP.NET 应用程序的脚本映射。使用 -ir 选项安装 ASP.NET,无需更新脚本映射。要卸载与该工具相关的 ASP.NET 版本,请使用 -u 选项。如果想从计算机中卸载所有版本的 ASP.NET,请使用 -ua 选项。

您可以使用 Aspnet_regiis.exe 查看关于 ASP.NET 的信息。要列出所有已安装的 ASP.NET 版本的状态和安装路径,请使用 -lv 选项。如果您要查看由 ASP.NET 脚本映射的所有 IIS 配置数据库项的路径,请使用 -lk 选项。

客户端脚本(如客户端验证)可以使用 Aspnet_regiis.exe 来进行安装和删除。将与工具相关联的 ASP.NET 版本的客户端脚本安装到每个 IIS 站点目录的 aspnet_client 子目录中,请使用 -c 选项。要删除与工具相关的 ASP.NET 版本的客户端脚本,请使用 -e 选项。要删除所有已安装的 ASP.NET 版本,请使用 -ea 选项。

有关在 ASP.NET 中并行执行的详细信息,请参阅 ASP.NET 中的并行支持。有关脚本映射和应用程序根路径的详细信息,请参阅设置应用程序映射。

示例
下列命令将指向与 Aspnet_regiis.exe 相关的 ASP.NET 版本的脚本映射安装到 SampleApp1 应用程序及其所有子应用程序中。

Aspnet_regiis -s W3SVC/1/ROOT/SampleApp1
下列命令仅会更新 SampleApp1 应用程序的脚本映射,而不会影响子目录中的应用程序。

Aspnet_regiis -sn W3SVC/1/ROOT/SampleApp1
下列命令将安装与工具相关的 ASP.NET 版本,并更新所有现有 ASP.NET 应用程序的脚本映射。请注意仅有在当前脚本映射到早期 ASP.NET 版本的应用程序才会受到影响。

Aspnet_regiis -i
下列命令将安装与工具相关的 ASP.NET 版本,但不会更新现有 ASP.NET 应用程序的脚本映射。

Aspnet_regiis -ir
下列命令显示在计算机上安装的所有 ASP.NET 版本的状态和安装路径。

Aspnet_regiis -lv

会站起来了

昨天我会站起来了,不光是扶着别的东西,就是撒开了两只手我也能停上好几秒钟了。然后不是向后一个屁股墩就是向前趴哪儿了,然后自己就乐了。自己能站起来我好高兴啊…
?
现在虽然还不会说话,但不是我也“吼吼”的发出些声音来,特别是玩到什么新玩具的时候。我是想让大家分享我的快乐呀,可爸爸说我象“大猩猩”,说大猩猩胜利的时候就是举着双臂,嘴里"嘿咻嘿咻"个不停…

[旧作]无关技术的官司

无关技术的官司(1997.11.7)

Microsoft公司最近官司连连。和Sun的关于Java的官司还没有眉目,美国司法部又于近日指控Microsoft公司要求各电脑生产厂商在安装微软的Windows 95软件时同时安装它的Web浏览器产品Internet Explorer。这违反了1995年司法部和Microsoft公司达成的反托拉斯协议法令。在这个法令中,Microsoft公司不得将产品许可证相互联系,即不能够在操作系统的许可证的基础上销售如Microsoft Word之类的应用软件。

但在同一个法令中也同样指出了,Microsoft可以在向PC制造商出售许可证的操作系统中增加新的功能。这就造成了一定程度的混淆,也成了Microsoft反击司法部的有力武器。

由此看来问题的核心在于技术上对操作系统的定义和浏览器的定位。浏览器究竟是操作系统不可分割的一部分,是操作系统之内的不可缺少的特征,还是它是一个完全独立的产品,只能够作为一个应用软件来对待。又或者它可以作为操作系统的一个功能性扩展,因此Microsoft可以象Windows 95 OSR2那样销售,在这个版本的引导画面上,显示的是蓝天白云和飞扬的窗口,以及”Windows with Internet Explorer”。

这正是卷入官司的双方争论的焦点,双方都在搜集一切有利于自己的证据,当然要证明的结论是大相径庭的。司法部的一位助理检察官Joel Klein在一个采访中谈道,确定 Internet Explorer 是否是一个独立于Windows 95的产品是司法部的调查过程中最耗费时间的工作,其过程几乎持续了一年之久,目前已经掌握了将近15页的文件材料。

而Microsoft的官员则表示:IE是操作系统的一部分,就象其它系统工具软件一样,因此不属于协议的限制范围。Microsoft一直在为操作系统进行升级,只是这次的升级在网络方面,是为了增强操作系统进入Internet的功能。

我不知道司法部完整的15页材料都有些什么,只听到Joel Klein说包括Microsoft的文档在内的多个例子都说明了IE是一个独立的产品。这似乎和Microsoft的论调并不一致。可是这并不奇怪,在两年前,恐怕谁都不会否认浏览器只是一个应用程序,恐怕谁也不会想到浏览器会和操作系统集成,包括Microsoft自己也不会想到。只是技术的发展日新月异,为什么昨日的应用程序不能够变成今日操作系统的一个特征呢?

其实,造成模糊的原因之一就是,在95年的反托拉斯法令上,根本没有提及Internet和Web,上面对于操作系统软件的定义是“一组用于控制个人计算机系统的操作和管理计算机的内存和诸如键盘,显示屏幕,磁盘驱动器和打印机等附属设备之间的交互的指令,代码和辅助信息。”那时候Internet远未流行,Web浏览器还在襁褓之中,谁能预见到这两年里的天翻地覆呢?这说明了过去技术是在迅猛发展的。

老实说,这个定义有点无力,司法部完全可以避免使用95年的这个旧的协议法令,而提出一个新的指控。可是为什么不呢?因为司法部要避免重开一个独立的反垄断案,那样意味着又一个重头开始旷日持久的调查,而等到结果出来的时候,也许Internet Explorer又已成明日黄花,没有意义了。这不又暗示着将来技术也将会是不断发展吗?

而且如果纯从技术的角度来看,我觉得将浏览器的功能集成进操作系统好处是很明显的。浏览器的几个特点都可以作为下一代操作系统的要素:使用URL访问方式,使得在线的资源和本地资源以同样的形式为用户所用;浏览器界面,允许用户更方便地在资源之间切换和转移;动态HTML能力,提供以平台为中心的方式来获取用户输入并表示结果。因此我认为,将IE集成进操作系统不仅仅是让操作系统运行得更好,这样的方式本身就是一个现代的操作系统的核心,是一个先进的操作系统不可分割的关键部分。正如Microsoft所说的,这样的操作系统
能更好地适应Internet时代的需要。

从纯技术的角度来说,我心中是向着Microsoft的,Microsoft的集成性工作的确可以带来许多我们在技术上盼望的东西。可是问题的关键真的在技术领域,在于操作系统的定义和浏览器的定位吗?难道真的有必要将浏览器是否是操作系统一部分的问题搞得那样清楚?试想一下,如果Apple公司在Macintosh的最新的操作系统—-狂想曲(Rhapsody)里加入了浏览器的功能,甚至是象Windows 98一样将浏览器集成在内了,也有Active Desktop, 也使用浏览器界面和同样的操作来对远程和本地的资源进行访问,司法部是否也会如此地大动干戈?我想不太可能,没有谁在乎。可是Microsoft不行,因为它控制了几乎90%的操作系统市场和大约50%的商业应用程序市场,它去年的利润要比排在它之后的多家软件公司的总和都要多。

再从另一个角度来想一想,为什么在Win95中加了那么多系统工具软件没有什么问题,一旦Microsoft在95的桌面上增加MSN(Microsoft Network)的图标就不行?使得它后来将这个图标做为安装的可选项。一旦要在操作系统里增加浏览器功能就又不行了?使得它又卷进了目前的这场官司。因为谁都知道,Internet和Web技术是最有希望打破Microsoft工业界中的垄断和市场上领导性地位的。因此Netscape的Navigator, Sun的Java, Oracle的NC, 都纷纷攘壤,要出来和Microsoft对抗。而Microsoft的这些手段,特别是目前在操作系统的许可证基础上捆绑销售IE的方式就明显有了利用操作系统的垄断性优势来扩展在Internet市场份额和地位,借以打击其它竞争厂商的意图。

所以仔细考虑一下就可以知道,问题的关键根本无关技术,而在于Microsoft的垄断以及Internet技术和Web技术的特殊地位。有些事情并不是单纯的技术上的事情,到一定时候就会通过其它手段来干预。作为软件业界的支配者,Microsoft就得面对这样一个特殊的法则。这些结论恐怕大家也都心中有数,可是让我想起来总觉得可笑是,对于这场无关技术的官司,双方却又都在技术领域寻找证据,讨论什么“浏览器究竟是否是一个独立于操作系统的产品”。

如果司法部获胜了,将是最大的受益者,谁将笑得最甜呢? 很显然的,是Netscape和Microsoft的其它竞争对手(有人戏称为NOISE阵营,Netscape, Oracle, IBM, Sun and Else)。其它虽然苦Microsoft久矣却又依赖于
Microsoft的PC厂商呢?也许能够在以后和Microsoft的谈判中获得讨价还价的筹码,胆子能够因此壮一些。因此包括Compaq、Gateway 2000和Micron在内的许多PC厂商都在纷纷指控Microsoft拒绝这些厂商关于清除Win95中IE的要求。但是司法部的胜利是否真的对这些厂商有益呢?堤内损失堤外补,Microsoft会不会通过其它途径来报复呢?谁也说不准。

而对于最终用户呢?他们能否从司法部的胜利中获得好处?作为一个最终用户,我更关心他们的命运,其实也是关心自己的命运。可是我也说不准。也许可以这样说:虽然他们失去了在Windows 系统中集成浏览器功能的机会,但打破了Microsoft的垄断,有利于公平竞争,也许会在未来获得更大的利益。但反过来也可以说,虽然他们得到的是暂时阻止了Microsoft的垄断势头,但毕竟失去了在Windows系统中集成浏览器功能,得到一个更先进,更强大的操作系统的机会。

[旧作]谈谈Java

谈谈Java (1997.10.30)

Java的历史就不在这里重复了,总之Web和Web浏览器的出现和流行使Java从一个没有用武之地的丑小鸭突然间就变成了信息时代的宠儿。一夜之间,Java仿佛成了网络世界的救世主。

在那些宣传得沸沸扬扬的特性里,可移植性无疑是最有诱惑力的一点,也是我最感兴趣的一点。write once, run anywhere,这是一个多么激动人心的目标。至于它和C++语法相近,但更加简洁,易于学习等等,我并不以为然。因为我想最易于学习的东西也是需要一个学习周期的,不熟悉C++语法的人从中得不到好处,而对于熟悉C++的人来说,假使这种语言没有什么新的特点的话,又何必去学习呢?再说,语言只是一种工具,好的工具只是使产生好的程序更加容易,而不是使产生好的程序成为必然,更重要的因素是程序的设计者和编写者。是人,而不是语言造就一个优秀的程序。我见过有些人用BASIC写的程序比另一些人用C写的程序结构化更好,可读性更佳。

记得在大学里刚刚开始学习C语言的时候,书上说C的一个最大的优点就是移植性好。 Ken Tompson和Dennis M. Richie这两个UNIX和C的鼻祖用C重写了UNIX,这才造就了UNIX的一世英名。可是这种移植性并没有发展到一种激动人心的地步。因为只有标准的ANSI C才能够实现这样的可移植性,可是随着软硬件技术的发展,越来越流行的GUI界面,人机交互,以及各种外设,完全超出了ANSI C所表达的范围。越来越多的功能成为操作系统的标准部分,例如显卡驱动和打印机驱动。你用不用?用,不同的操作系统并不是都实现了这些功能,即使实现了也不是以相同的方式。不用,你的程序还能够干些什么?

当Windows平台逐渐占据主导地位的时候,又一种可移植性被提了出来,叫做API级兼容。想法也很好,不管在什么硬件平台上,系统的功能通过相同的API调用来提供,底层实现的差异通过相同的API调用来掩盖。只要程序使用这些API,那么不管使用S3, Trident显卡,或是HP, EPSON, Brother打印机,应用程序可以以相同的方式自由使用操作系统丰富的底层功能了,发展到NT,CPU的差异也逐渐被掩盖,不管在Intel, Alpha, PowerPC, MIPS上API都是一样的。因此你不再需要编写不同的代码来区分不同的CPU,适应不同的显示模式,来使用不同的打印机。92年底,厌倦了为不同打印机编写打印代码的我刚刚接触Windows,为了这种兼容性欣喜万分。但过了几年,我开始考虑将公司的一个Windows软件移植到Unix上时,这才关心这样一个问题:这时候该怎么办?

Java建立在虚拟机的基础上,从源代码兼容和API兼容上又向前走了一步,实际上已经是一种可执行代码的兼容,尽管这种代码是解释执行的。可是现在的我已经不那么容易欣喜了。Java的这种的可移植性只是一种承诺,可是承诺和现实可是差得很大的两回事。多运行一些Java Applet, 你就会发现相同的Applet在不同的
浏览器上有时候运行效果并不一样,而且我也曾经被Java的汉字支持和处理的问题搞得焦头烂额,狼狈不堪。这很容易理解,各个厂商都有自己不同的Java虚拟机的设计,谁能保证这些设计在不同厂商不同平台之上有相同的表现?谁又能保证自己的虚拟机中没有几个BUG?特别是在现在Java还不算十分成熟,在这上面还没有积累足够的经验的时候?

而且虚拟机的概念也使性能很成问题。对于小的Java applet虽然就已经有人抱怨了,但我觉得问题还不算严重,至少还能忍受。对于那些application来说呢?我只用过两个用Java编写的应用程序,浏览器HotJava和编Java用的集成环境Java Workshop,速度慢得我这样自以为还是很有耐心的人也忍受不了。Corel最近也放弃了将它所有应用程序,包括著名的CorelDraw和WordPerfect移植到Java的计划。Java这杯香喷喷的热咖啡,太急着喝也会烫了嘴的。

虽然JIT(Just-In-Time, 即时编译器)得到了发展,可以大大加快速度,但说到底,Java虚拟机的规范使得很多独特的硬件功能无法使用,对于这点一般的厂商可没办法,只得通过改变规范来实现。说起规范,Sun最近要控告Microsoft,是说Microsoft在它的IE中实现的Java不是100% Pure Java. Microsoft回击说它的PURE是指Perfectly compatible, Ubiquitous, Rich set of class library, Extensible(完美的兼容性,广泛的可用性,丰富的类库,可扩展性)。不谈PURE的定义问题和Microsoft的野心和企图,至少Microsoft这个目标是很不错的,而且它也是朝着这样的目标发展的。事实上Microsoft的Java虚拟机是兼容性最好的,它的Java类库AFC(Application Foundation Classes)也做得很漂亮,它提供了Java和ActiveX相互作用的方法。虽说我也很不满Microsoft在计算机界一手遮天,可是Java的标准是被SUN一家所控制,这样的做法,和Microsoft把持着Windows操作系统有什么区别呢?标准是必须的,但不应有一家所把握,因为这样极大地限制着创造力。王小波在他的杂文里总说世界的美好在于参差多态,我心里也向往着这种美好。这样的美好源于竞争,源于市场驱动,源于竞争中创造力能被极大地激发出来,技术能得到更大的发展,而我们普通用户,能得到更大的利益。

有人说Java是网络世界的救世主,仿佛Java一出,天下太平,我是不信的。还记得Ada语言刚出台的时候被政府规定为标准语言,可现在用Ada的有多少?C语言良好的可移植性使其迅速成为了各种平台上的通用语言,但并没有最终解决跨平台编程的问题。C++语言以它面向对象的概念和类的方式试图解决软件重用的问题,但这个问题仍旧深深困扰着软件工业界,因此现在又有了用软组件(Software Component)来解决重用问题的概念。所以不要把Java看成是解决一切问题的灵丹妙药,还是好好发展,不要过于自信地预言未来吧。

说了这么多Java的“坏话”,但我心里仍旧认为它是个优秀的编程语言,Java毕竟是这个信息时代的伟大的产物,能解决许多问题。虽然同样还存在许多问题,但有了问题才有解决的目标。有了移植性的问题才有了C语言,才有了API兼容的概念,才有了Java虚拟机。有了性能问题,才有了JIT。有了软件重用的问题,才有了面向对象,才有了软组件。我只是想说:将来必定还有更伟大的产物被创造出来。人的创造力是无穷的,因此技术的发展也是没有终结的。总有人会有神奇的灵感,让这世界更加美丽的。