首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 数据库 第二书店 程序员

java060515/ 


共524个网摘 [ 1  2  3  4  5  6 ... 18 ]  下一页  |  访问java060515的个人空间

ASP.NET中常用的26个优化性能方法

java060515收录,使用标签:.NET,时间:2008-7-17 15:43:59 | 相关网摘我也收藏

1. 数据库访问性能优化 
 
数据库的连接和关闭

访问数据库资源需要创建连接、打开连接和关闭连接几个操作。这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源。ASP.NET中提供了连接池(Connection Pool)改善打开和关闭数据库对性能的影响。系统将用户的数据库连接放在连接池中,需要时取出,关闭时收回连接,等待下一次的连接请求。连接池的大小是有限的,如果在连接池达到最大限度后仍要求创建连接,必然大大影响性能。因此,在建立数据库连接后只有在真正需要操作时才打开连接,使用完毕后马上关闭,从而尽量减少数据库连接打开的时间,避免出现超出连接限制的情况。   

使用存储过程  
 
存储过程是存储在服务器上的一组预编译的SQL语句,类似于DOS系统中的批处理文件。存储过程具有对数据库立即访问的功能,信息处理极为迅速。使用存储过程可以避免对命令的多次编译,在执行一次后其执行规划就驻留在高速缓存中,以后需要时只需直接调用缓存中的二进制代码即可。另外,存储过程在服务器端运行,独立于ASP.NET程序,便于修改,最重要的是它可以减少数据库操作语句在网络中的传输。

优化查询语句
  
ASP.NET中ADO连接消耗的资源相当大,SQL语句运行的时间越长,占用系统资源的时间也越长。因此,尽量使用优化过的SQL语句以减少执行时间。比如,不在查询语句中包含子查询语句,充分利用索引等。   

2. 字符串操作性能优化 
 
使用值类型的ToString方法
  
在连接字符串时,经常使用"+"号直接将数字添加到字符串中。这种方法虽然简单,也可以得到正确结果,但是由于涉及到不同的数据类型,数字需要通过装箱操作转化为引用类型才可以添加到字符串中。但是装箱操作对性能影响较大,因为在进行这类处理时,将在托管堆中分配一个新的对象,原有的值复制到新创建的对象中。使用值类型的ToString方法可以避免装箱操作,从而提高应用程序性能。   

运用StringBuilder类   

String类对象是不可改变的,对于String对象的重新赋值在本质上是重新创建了一个String对象并将新值赋予该对象,其方法ToString对性能的提高并非很显著。在处理字符串时,最好使用StringBuilder类,其.NET 命名空间是System.Text。该类并非创建新的对象,而是通过Append,Remove,Insert等方法直接对字符串进行操作,通过ToString方法返回操作结果。   其定义及操作语句如下所示:


int num;   System.Text.StringBuilder str = new System.Text.StringBuilder(); //创建字符串   str.Append(num.ToString()); //添加数值num   Response.Write(str.ToString); //显示操作结果3. 优化 Web 服务器计算机和特定应用程序的配置文件以符合您的特定需要

默认情况下,ASP.NET 配置被设置成启用最广泛的功能并尽量适应最常见的方案。因此,应用程序开发人员可以根据应用程序所使用的功能,优化和更改其中的某些配置,以提高应用程序的性能。下面的列表是您应该考虑的一些选项。

仅对需要的应用程序启用身份验证。

默认情况下,身份验证模式为 Windows,或集成 NTLM。大多数情况下,对于需要身份验证的应用程序,最好在 Machine.config 文件中禁用身份验证,并在 Web.config 文件中启用身份验证。根据适当的请求和响应编码设置来配置应用程序。ASP.NET 默认编码格式为 UTF-8。如果您的应用程序为严格的 ASCII,请配置应用程序使用 ASCII 以获得稍许的性能提高。
  
考虑对应用程序禁用 AutoEventWireup。

在 Machine.config 文件中将 AutoEventWireup 属性设置为 false,意味着页面不将方法名与事件进行匹配和将两者挂钩(例如 Page_Load)。如果页面开发人员要使用这些事件,需要在基类中重写这些方法(例如,需要为页面加载事件重写 Page.OnLoad,而不是使用 Page_Load 方法)。如果禁用 AutoEventWireup,页面将通过将事件连接留给页面作者而不是自动执行它,获得稍许的性能提升。

从请求处理管线中移除不用的模块。

默认情况下,服务器计算机的 Machine.config 文件中 节点的所有功能均保留为激活。根据应用程序所使用的功能,您可以从请求管线中移除不用的模块以获得稍许的性能提升。检查每个模块及其功能,并按您的需要自定义它。例如,如果您在应用程序中不使用会话状态和输出缓存,则可以从 列表中移除它们,以便请求在不执行其他有意义的处理时,不必执行每个模块的进入和离开代码。

4. 一定要禁用调试模式  

在部署生产应用程序或进行任何性能测量之前,始终记住禁用调试模式。如果启用了调试模式,应用程序的性能可能受到非常大的影响。   

5. 对于广泛依赖外部资源的应用程序,请考虑在多处理器计算机上启用网络园艺  

ASP.NET 进程模型帮助启用多处理器计算机上的可缩放性,将工作分发给多个进程(每个CPU一个),并且每个进程都将处理器关系设置为其 CPU。此技术称为网络园艺。如果应用程序使用较慢的数据库服务器或调用具有外部依赖项的 COM 对象(这里只是提及两种可能性),则为您的应用程序启用网络园艺是有益的。但是,在决定启用网络园艺之前,您应该测试应用程序在网络园中的执行情况。   

6. 只要可能,就缓存数据和页输出  

ASP.NET 提供了一些简单的机制,它们会在不需要为每个页请求动态计算页输出或数据时缓存这些页输出或数据。另外,通过设计要进行缓存的页和数据请求(特别是在站点中预期将有较大通讯量的区域),可以优化这些页的性能。与 .NET Framework 的任何 Web 窗体功能相比,适当地使用缓存可以更好的提高站点的性能,有时这种提高是超数量级的。使用 ASP.NET 缓存机制有两点需要注意。首先,不要缓存太多项。缓存每个项均有开销,特别是在内存使用方面。不要缓存容易重新计算和很少使用的项。其次,给缓存的项分配的有效期不要太短。很快到期的项会导致缓存中不必要的周转,并且经常导致更多的代码清除和垃圾回收工作。若关心此问题,请监视与 ASP.NET Applications 性能对象关联的 Cache Total Turnover Rate 性能计数器。高周转率可能说明存在问题,特别是当项在到期前被移除时。这也称作内存压力。


7. 选择适合页面或应用程序的数据查看机制  

根据您选择在 Web 窗体页显示数据的方式,在便利和性能之间常常存在着重要的权衡。例如,DataGrid Web 服务器控件可能是一种显示数据的方便快捷的方法,但就性能而言它的开销常常是最大的。在某些简单的情况下,您通过生成适当的 HTML 自己呈现数据可能很有效,但是自定义和浏览器定向会很快抵销所获得的额外功效。Repeater Web 服务器控件是便利和性能的折衷。它高效、可自定义且可编程。   

8. 将 SqlDataReader 类用于快速只进数据游标  

SqlDataReader 类提供了一种读取从 SQL Server 数据库检索的只进数据流的方法。如果当创建 ASP.NET 应用程序时出现允许您使用它的情况,则 SqlDataReader 类提供比 DataSet 类更高的性能。情况之所以这样,是因为 SqlDataReader 使用 SQL Server 的本机网络数据传输格式从数据库连接直接读取数据。另外,SqlDataReader 类实现 IEnumerable 接口,该接口也允许您将数据绑定到服务器控件。有关更多信息,请参见 SqlDataReader 类。有关 ASP.NET 如何访问数据的信息,请参见通过 ASP.NET 访问数据。   

9. 将 SQL Server 存储过程用于数据访问  

在 .NET Framework 提供的所有数据访问方法中,基于 SQL Server 的数据访问是生成高性能、可缩放 Web 应用程序的推荐选择。使用托管 SQL Server 提供程序时,可通过使用编译的存储过程而不是特殊查询获得额外的性能提高。   

10. 避免单线程单元 (STA) COM 组件  

默认情况下,ASP.NET 不允许任何 STA COM 组件在页面内运行。若要运行它们,必须在 .aspx 文件内将 ASPCompat=true 属性包含在 @ Page 指令中。这样就将执行用的线程池切换到 STA 线程池,而且使 HttpContext 和其他内置对象可用于 COM 对象。前者也是一种性能优化,因为它避免了将多线程单元 (MTA) 封送到 STA 线程的任何调用。使用 STA COM 组件可能大大损害性能,应尽量避免。若必须使用 STA COM 组件,如在任何 interop 方案中,则应在执行期间进行大量调用并在每次调用期间发送尽可能多的信息。另外,小心不要在构造页面期间创建任何 STA COM 组件。例如下面的代码中,在页面构造时将实例化由某个线程创建的 MySTAComponent,而该线程并不是将运行页面的 STA 线程。这可能对性能有不利影响,因为要构造页面就必须完成 MTA 和 STA 线程之间的封送处理。


<%@ Page Language="VB" ASPCompat="true" %> Dim myComp as new MySTAComponent() Public Sub Page_Load() myComp.Name = "Bob" End Sub <% Response.Write(myComp.SayHello) %>


首选机制是推迟对象的创建,直到以后在 STA 线程下执行上述代码,如下面的例子所示。




<%@ Page Language="VB" ASPCompat="true" %> Dim myComp Public Sub Page_Load() myComp = new MySTAComponent() myComp.Name = "Bob" End Sub <% Response.Write(myComp.SayHello) %>

推荐的做法是在需要时或者在 Page_Load 方法中构造任何 COM 组件和外部资源。永远不要将任何 STA COM 组件存储在可以由构造它的线程以外的其他线程访问的共享资源里。这类资源包括像缓存和会话状态这样的资源。即使 STA 线程调用 STA COM 组件,也只有构造此 STA COM 组件的线程能够实际为该调用服务,而这要求封送处理对创建者线程的调用。此封送处理可能产生重大的性能损失和可伸缩性问题。在这种情况下,请研究一下使 COM 组件成为 MTA COM 组件的可能性,或者更好的办法是迁移代码以使对象成为托管对象。   

11. 将调用密集型的 COM 组件迁移到托管代码  

.NET Framework 提供了一个简单的方法与传统的 COM 组件进行交互。其优点是可以在保留现有投资的同时利用新的平台。但是在某些情况下,保留旧组件的性能开销使得将组件迁移到托管代码是值得的。每一情况都是不一样的,决定是否需要迁移组件的最好方法是对 Web 站点运行性能测量。建议您研究一下如何将需要大量调用以进行交互的任何COM 组件迁移到托管代码。许多情况下不可能将旧式组件迁移到托管代码,特别是在最初迁移 Web 应用程序时。在这种情况下,最大的性能障碍之一是将数据从非托管环境封送到托管环境。因此,在交互操作中,请在任何一端执行尽可能多的任务,然后进行一个大调用而不是一系列小调用。例如,公共语言运行库中的所有字符串都是 Unicode 的,所以应在调用托管代码之前将组件中的所有字符串转换成 Unicode 格式。另外,一处理完任何 COM 对象或本机资源就释放它们。这样,其他请求就能够使用它们,并且最大限度地减少了因稍后请求垃圾回收器释放它们所引起的性能问题。   

12. 在 Visual Basic .NET 或 JScript. 代码中使用早期绑定  

以往,开发人员喜欢使用 Visual Basic、VBScript. 和 JScript. 的原因之一就是它们所谓“无类型”的性质。变量不需要显式类型声明,并能够简单地通过使用来创建它们。当从一个类型到另一个类型进行分配时,转换将自动执行。不过,这种便利会大大损害应用程序的性能。Visual Basic 现在通过使用 Option Strict 编译器指令来支持类型安全编程。为了向后兼容,默认情况下,ASP.NET 不启用该选项。但是,为了得到最佳性能,强烈建议在页中启用该选项。若要启用 Option Strict,请将 Strict 属性包括在 @ Page 指令中,或者,对于用户控件,请将该属性包括在 @ Control 指令中。下面的示例演示了如何设置该属性,并进行了四个变量调用以显示使用该属性是如何导致编译器错误的。

<%@ Page Language="VB" Strict="true" %> <% Dim B Dim C As String ' This will cause a compiler error. A = "Hello" ' This will cause a compiler error. B = "World" ' This will not cause a compiler error. C = "!!!!!!" ' But this will cause a compiler error. C = 0 %> JScript. .NET 也支持无类型编程,但它不提供强制早期绑定的编译器指令。若发生下面任何一种情况,则变量是晚期绑定的:被显式声明为 Object,是无类型声明的类的字段,是无显式类型声明的专用函数或方法成员,并且无法从其使用推断出类型。   最后一个差别比较复杂,因为如果 JScript. .NET 编译器可以根据变量的使用情况推断出类型,它就会进行优化。在下面的示例中,变量 A 是早期绑定的,但变量 B 是晚期绑定的。

var A;   var B;   A = "Hello";   B = "World";   B = 0; 为了获得最佳的性能,当声明 JScript. .NET 变量时,请为其分配一个类型。例如,var A : String。

13. 使请求管线内的所有模块尽可能高效  

请求管线内的所有模块在每次请求中都有机会被运行。因此,当请求进入和离开模块时快速地触发代码至关重要,特别是在不使用模块功能的代码路径里。分别在使用及不使用模块和配置文件时执行吞吐量测试,对确定这些方法的执行速度非常有用。

14. 使用 HttpServerUtility.Transfer 方法在同一应用程序的页面间重定向  

采用 Server.Transfer 语法,在页面中使用该方法可避免不必要的客户端重定向。
  
15. 必要时调整应用程序每个辅助进程的线程数  

ASP.NET 的请求结构试图在执行请求的线程数和可用资源之间达到一种平衡。已知一个使用足够 CPU 功率的应用程序,该结构将根据可用于请求的 CPU 功率,来决定允许同时执行的请求数。这项技术称作线程门控。但是在某些条件下,线程门控算法不是很有效。通过使用与 ASP.NET Applications 性能对象关联的 Pipeline Instance Count 性能计数器,可以在 PerfMon 中监视线程门控。当页面调用外部资源,如数据库访问或 XML Web services 请求时,页面请求通常停止并释放 CPU。如果某个请求正在等待被处理,并且线程池中有一个线程是自由的,那么这个正在等待的请求将开始被处理。遗憾的是,有时这可能导致 Web 服务器上存在大量同时处理的请求和许多正在等待的线程,而它们对服务器性能有不利影响。通常,如果门控因子是外部资源的响应时间,则让过多请求等待资源,对 Web 服务器的吞吐量并无帮助。为缓和这种情况,可以通过更改 Machine.config 配置文件节点的 maxWorkerThreads 和 maxIOThreads 属性,手动设置进程中的线程数限制。   

注意:辅助线程是用来处理 ASP.NET 请求的,而 IO 线程则是用于为来自文件、数据库或 XML Web services 的数据提供服务的。分配给这些属性的值是进程中每个 CPU 每类线程的最大数目。对于双处理器计算机,最大数是设置值的两倍。对于四处理器计算机,最大值是设置值的四倍。无论如何,对于有四个或八个 CPU 的计算机,最好更改默认值。对于有一个或两个处理器的计算机,默认值就可以,但对于有更多处理器的计算机的性能,进程中有一百或两百个线程则弊大于利。注意进程中有太多线程往往会降低服务器的速度,因为额外的上下文交换导致操作系统将 CPU 周期花在维护线程而不是处理请求上。   

16. 适当地使用公共语言运行库的垃圾回收器和自动内存管理  

小心不要给每个请求分配过多内存,因为这样垃圾回收器将必须更频繁地进行更多的工作。另外,不要让不必要的指针指向对象,因为它们将使对象保持活动状态,并且应尽量避免含 Finalize 方法的对象,因为它们在后面会导致更多的工作。特别是在 Finalize 调用中永远不要释放资源,因为资源在被垃圾回收器回收之前可能一直消耗着内存。最后这个问题经常会对 Web 服务器环境的性能造成毁灭性的打击,因为在等待 Finalize 运行时,很容易耗尽某个特定的资源。   

17. 如果有大型 Web 应用程序,可考虑执行预批编译  

每当发生对目录的第一次请求时都会执行批编译。如果目录中的页面没有被分析并编译,此功能会成批分析并编译目录中的所有页面,以便更好地利用磁盘和内存。如果这需要很长时间,则将快速分析并编译单个页面,以便请求能被处理。此功能带给 ASP.NET 性能上的好处,因为它将许多页面编译为单个程序集。从已加载的程序集访问一页比每页加载新的程序集要快。批编译的缺点在于:如果服务器接收到许多对尚未编译的页面的请求,那么当 Web 服务器分析并编译它们时,性能可能较差。为解决这个问题,可以执行预批编译。为此,只需在应用程序激活之前向它请求一个页面,无论哪页均可。然后,当用户首次访问您的站点时,页面及其程序集将已被编译。没有简单的机制可以知道批编译何时发生。需一直等到 CPU 空闲或者没有更多的编译器进程(例如 csc.exe(C# 编译器)或 vbc.exe(Visual Basic 编译器))启动。还应尽量避免更改应用程序的 \bin 目录中的程序集。更改页面会导致重新分析和编译该页,而替换 \bin 目录中的程序集则会导致完全重新批编译该目录。在包含许多页面的大规模站点上,更好的办法可能是根据计划替换页面或程序集的频繁程度来设计不同的目录结构。不常更改的页面可以存储在同一目录中并在特定的时间进行预批编译。经常更改的页面应在它们自己的目录中(每个目录最多几百页)以便快速编译。Web 应用程序可以包含许多子目录。批编译发生在目录级,而不是应用程序级。

18. 不要依赖代码中的异常  

因为异常大大地降低性能,所以您不应该将它们用作控制正常程序流程的方式。如果有可能检测到代码中可能导致异常的状态,请执行这种操作。不要在处理该状态之前捕获异常本身。常见的方案包括:检查 null,分配给将分析为数字值的 String 一个值,或在应用数学运算前检查特定值。下面的示例演示可能导致异常的代码以及测试是否存在某种状态的代码。两者产生相同的结果。


 try   {   result = 100 / num;   }   catch (Exception e)   {   result = 0;   }   // ...to this.   if (num != 0)   result = 100 / num;   else   result = 0;

19. 使用 HttpResponse.Write 方法进行字符串串联

该方法提供非常有效的缓冲和连接服务。但是,如果您正在执行广泛的连接,请使用多个 Response.Write 调用。下面示例中显示的技术比用对 Response.Write 方法的单个调用连接字符串更快。




Response.Write("a");   Response.Write(myString);   Response.Write("b");   Response.Write(myObj.ToString());   Response.Write("c");   Response.Write(myString2);   Response.Write("d");20. 除非有特殊的原因要关闭缓冲,否则使其保持打开

禁用 Web 窗体页的缓冲会导致大量的性能开销。   

21. 只在必要时保存服务器控件视图状态  

自动视图状态管理是服务器控件的功能,该功能使服务器控件可以在往返过程上重新填充它们的属性值(您不需要编写任何代码)。但是,因为服务器控件的视图状态在隐藏的窗体字段中往返于服务器,所以该功能确实会对性能产生影响。您应该知道在哪些情况下视图状态会有所帮助,在哪些情况下它影响页的性能。例如,如果您将服务器控件绑定到每个往返过程上的数据,则将用从数据绑定操作获得的新值替换保存的视图状态。在这种情况下,禁用视图状态可以节省处理时间。默认情况下,为所有服务器控件启用视图状态。若要禁用视图状态,请将控件的EnableViewState 属性设置为 false,如下面的 DataGrid 服务器控件示例所示。




您还可以使用 @ Page 指令禁用整个页的视图状态。当您不从页回发到服务器时,这将十分有用:


<%@ Page EnableViewState="false" %>

注意:@ Control 指令中也支持 EnableViewState 属性,该指令允许您控制是否为用户控件启用视图状态。若要分析页上服务器控件使用的视图状态的数量,请(通过将 trace="true" 属性包括在 @ Page 指令中)启用该页的跟踪并查看 Control Hierarchy 表的 Viewstate 列。有关跟踪和如何启用它的信息,请参见 ASP.NET 跟踪。

22. 避免到服务器的不必要的往返过程  

虽然您很可能希望尽量多地使用 Web 窗体页框架的那些节省时间和代码的功能,但在某些情况下却不宜使用 ASP.NET 服务器控件和回发事件处理。通常,只有在检索或存储数据时,您才需要启动到服务器的往返过程。多数数据操作可在这些往返过程间的客户端上进行。例如,从 HTML 窗体验证用户输入经常可在数据提交到服务器之前在客户端进行。通常,如果不需要将信息传递到服务器以将其存储在数据库中,那么您不应该编写导致往返过程的代码。如果您开发自定义服务器控件,请考虑让它们为支持 ECMAScript. 的浏览器呈现客户端代码。通过以这种方式使用服务器控件,您可以显著地减少信息被不必要的发送到 Web 服务器的次数。

使用 Page.IsPostBack 避免对往返过程执行不必要的处理

如果您编写处理服务器控件回发处理的代码,有时可能需要在首次请求页时执行其他代码,而不是当用户发送包含在该页中的 HTML 窗体时执行的代码。根据该页是否是响应服务器控件事件生成的。

使用 Page.IsPostBack 属性有条件地执行代码

例如,下面的代码演示如何创建数据库连接和命令,该命令在首次请求该页时将数据绑定到 DataGrid 服务器控件。


void Page_Load(Object sender, EventArgs e)   {   // Set up a connection and command here.   if (!Page.IsPostBack)   {   String query = "select * from Authors where FirstName like '%JUSTIN%'";   myCommand.Fill(ds, "Authors");   myDataGrid.DataBind();   }   }

由于每次请求时都执行 Page_Load 事件,上述代码检查 IsPostBack 属性是否设置为 false。如果是,则执行代码。如果该属性设置为 true,则不执行代码。注意 如果不运行这种检查,回发页的行为将不更改。Page_Load 事件的代码在执行服务器控件事件之前执行,但只有服务器控件事件的结果才可能在输出页上呈现。如果不运行该检查,仍将为 Page_Load 事件和该页上的任何服务器控件事件执行处理。   

23. 当不使用会话状态时禁用它  

并不是所有的应用程序或页都需要针对于具体用户的会话状态,您应该对任何不需要会话状态的应用程序或页禁用会话状态。   若要禁用页的会话状态,请将 @ Page 指令中的 EnableSessionState 属性设置为 false。例如:



<%@ Page EnableSessi %> 注意:如果页需要访问会话变量,但不打算创建或修改它们,则将@ Page 指令中的 EnableSessionState 属性设置为ReadOnly。还可以禁用 XML Web services 方法的会话状态。有关更多信息,请参见使用 ASP.NET 和 XML Web services 客户端创建的 XML Web services。若要禁用应用程序的会话状态,请在应用程序 Web.config 文件的 sessionstate 配置节中将 mode 属性设置为 off。例如:



24. 仔细选择会话状态提供程序  

ASP.NET 为存储应用程序的会话数据提供了三种不同的方法:进程内会话状态、作为 Windows 服务的进程外会话状态和 SQL Server 数据库中的进程外会话状态。每种方法都有自己的优点,但进程内会话状态是迄今为止速度最快的解决方案。如果只在会话状态中存储少量易失数据,则建议您使用进程内提供程序。进程外解决方案主要用于跨多个处理器或多个计算机缩放应用程序,或者用于服务器或进程重新启动时不能丢失数据的情况。有关更多信息,请参见 ASP.NET 状态管理。   

25. 不使用不必要的Server Control

ASP.net中,大量的服务器端控件方便了程序开发,但也可能带来性能的损失,因为用户每操作一次服务器端控件,就产生一次与服务器端的往返过程。因此,非必要,应当少使用Server Control。   

26. ASP.NET应用程序性能测试  

在对ASP.NET应用程序进行性能测试之前,应确保应用程序没有错误,而且功能正确。具体的性能测试可以采用以下工具进行:Web Application Strees Tool (WAS)是Microsoft发布的一个免费测试工具,可以从http://webtool.rte.microsoft.com/上下载。它可以模拟成百上千个用户同时对web应用程序进行访问请求,在服务器上形成流量负载,从而达到测试的目的,可以生成平均TTFB、平均TTLB等性能汇总报告。Application Center Test (ACT) 是一个测试工具,附带于Visual Studio.NET的企业版中,是Microsoft正式支持的web应用程序测试工具。它能够直观地生成图表结果,功能比WAS多,但不具备多个客户机同时测试的能力。服务器操作系统"管理工具"中的"性能"计数器,可以对服务器进行监测以了解应用程序性能。   

结论:

对于网站开发人员来说,在编写ASP.NET应用程序时注意性能问题,养成良好的习惯,提高应用程序性能,至少可以推迟必需的硬件升级,降低网站的成本。


IE8 Beta 2即将发布,您的网站准备好了吗?

java060515收录,使用标签:.NET,时间:2008-7-17 15:40:09 | 相关网摘我也收藏

在奥运会期间, IE8 Beta2将会发布,而且随着英文版的发布,中文版也会在第一波当中进行发布。

IE 8将会是Internet Explorer历史上最重要的一个版本发布,除了其带有中国传统的吉祥数字“8”以外,最主要的是其对标准的兼容性上得到了极高的增强,这对于网页开发人员来说,最大的便利就是不用再为每种浏览器(甚至某种浏览器的不同版本)开发不同的CSS来进行适应。以后网页开发人员只需要兼容W3C的标准即可,而不需要把过度的精力放在不同浏览器标准的相异性上。发布时间在即,那么您的网站是否已经准备好了呢?

1) 兼容性考虑

目前的网站由于各种历史原因,可能针对不同的浏览器设置了不同的CSS文件。而针对IE 8,可能大部分网站尚没有做好准备。可能很多朋友知道,IE 8带有一个“切换IE 7模仿模式”的按钮,而且在Beta 1以及Beta 2期间,这个按钮是设置在默认选中状态。但是在IE 8正式发布的时候,该按钮默认将会是非选中状态,这就表示着如果一个网站没有做任何准备功课,在IE 8下将会以严格模式来常解析CSS。

前段时间,我与合作伙伴见面时,曾经特意使用IE 8 Beta 2的严格模式浏览过大部分合作伙伴的网页,都会出现或多或少的显示变形的问题,使得网站无法进行正确浏览。如果您的网站尚未做过IE 8的兼容性测试,建议您尽快下载IE 8的Beta 1,并且将其切换到IE 8严格模式,对您的网站进行浏览。

如果您发现问题,并且感觉在短期内无法修复,您也可以通过在页面当中添加Meta标签,在服务器端强制IE 8使用“IE 7模仿模式”,做法很简单:

a. 针对全站页面: 您可以修改Web服务器(如Apache/IIS/Resin等)的HTTP头信息,在其中增加以下指令: X-UA-Compatible: IE=EmulateIE7。这个是我个人强烈推荐的做法,在您无法进行全站测试的情况下,可以先使用此方式使IE 8的严格模式暂时失效。

b. 针对单独页面:如果您的网站大部分页面在IE 8严格模式下显示正常,只有个别页面出现问题,建议在出现问题的页面的页首,即Head标签内添加以下Meta标签:



更多信息,请参考: http://support.microsoft.com/kb/952030/

2) 制作Activity以及WebSlice

IE 8在Beta 1期间曝光了两个新特性,即Activity(活动)以及WebSlice(源剪辑),目前国内很多网站已经基于Activity以及WebSlice制作了相关的内容,在IE 8 Beta 2期间,您会发现更多的网站会发布这些实用的小工具。以下是目前已经对外发布的一些网站:

a. 淘宝:http://ie8.taobao.com

b. 网易:http://ie8.163.com

c. 百度:http://stock.baidu.com/ie8/ie8.html

d. 腾讯:http://labs.qq.com/e/49/

甚至包括.NET开发人员常去的博客园也已经发布了其最新文章的Web Slice,有兴趣的话可以使用IE 8 Beta 1来访问博客园的首页。另外,如果您也使用Firefox 3,您可以发现已经有人开发了面向Firefox 3的Activity以及WebSlice插件。

Activity的使用场景:您的网站提供一系列的服务,允许贵网站的用户通过在其它网站的主动操作来调用此服务。比如假设您是一个财经网站,提供查询股票/基金信息的服务,通过Activity,您可以让您的用户在其它网站上浏览股评信息时,不需要跳转到贵网站,即可以通过右键菜单调用贵网站的相应服务。如果感兴趣,可以下载Activity开发白皮书。

WebSlice的使用场景:您的网站提供一些实时性信息,比如新闻、股票信息等,而希望用户可以在不返回相应页面的时候,当内容发生改动时,即可以推送给最终用户,您可以选择WebSlice。而开发代价仅仅只是将页面当中的某一个标签内的“Class”元素设置为“hslice”这个特殊名称即可,详细信息请阅读WebSlice开发白皮书。

另外,在IE 8 Beta 2发布时,微软将会发布一个面向IE 8全新的Gallery网站,用以搜索各个网站开发的WebSlice/Activity等面向IE 8新特性的组件,并且提供最终用户评估/下载,如果您希望您开发的WebSlices/Activity能够得到用户的青睐,那么就从现在开始吧:早起的鸟儿有虫吃。 :)

3) 其它

IE 8 Beta 2发布时,还将会带来一系列的新特性,在前段时期,已经面向国内一些领先的网站进行过交流,很多合作伙伴都非常感兴趣,并且正在开发此上的服务,相信在奥运会期间大家会看到此类的成果(依据NDA协议,此类网站也已经从微软拿到了IE 8 Beta 2的早期内部版本)。微软也将会举办一系列的市场活动,用以推广我们的合作伙伴所开发的各种面向IE 8的新的服务。

IE 8 Beta 2即将发布,无论您是企业网站的网页设计人员,还是个人网站的站长,都需要尽快为IE 8做好准备。 希望本文对您有帮助。



Silverlight 下换肤的实现

java060515收录,使用标签:.NET,时间:2008-7-17 15:30:47 | 相关网摘我也收藏

Silverlight 目前控件要改变外观一般都通过 Style="{StaticResource SomeStyle}" 来指定,而不能统一设置一个默认的 Style. 为了重用,一般把 Style 都放到 App.xaml 的 Resources 字典中去。而 Style 的定义往往非常冗长,这样 App.xaml 就会变得非常臃肿,修改维护都很麻烦。并且,还不能支持多个控件批量切换 Style 的,总之弊端非常多。

幸好 Nikhil Kothari 想了个办法解决了这个问题。在使用方式上,借鉴了 asp.net 的 Theme 机制。只要在 Silverlight 程序的根目录下定义一个 Themes 目录,并按要求往其中放入相关的皮肤文件即可。这里建议的方式是每一个控件一个单独的 xaml, 其中放了一个 UserControl. 之所以用 UserControl 的目的是为了能用 Expression Blend 进行可视化设计,非常直观。

主要实现思想:

1. 继承了一个自定义的 App 子类. 使用者需要将现有的 App.xaml 改成使用该类才行。
(同时这个 App 类还实现了根据 initParameters 在 xaml 中动态指定加载的 UserControl 和 Theme 的功能)
其中设置一个 ThemeName 属性来定义 Theme 名称。

2. 在 App 启动时,根据这个属性名动态去加载相关 xaml 的 xml 文件,并解析之。这些皮肤的 xaml 文件在 VS 里是要把 Build Action 设置成 Content 的。这样可以生成到 xap 包里去,以便于加载。

3. 在读取多个 xaml 文件并解析的过程中对同样的 Style 根据优先级做了相应的覆盖合并。最终形成一个总的 xaml 文件内容。

4. 用 XamlReader 的 Load 方法加载最终的文档。将其中的资源都抽取出来,并塞到 App.Resources 字典里去。

5. 然后正常的控件视觉树开始创建。其中的视觉元素指定了StaticResource样式,这时它就能从App的资源字典里获取到皮肤样式。


注意:这里自始至终没有动态对控件指定Style的机制。因为Silverlight目前不支持。这个解决方案的主要思想就是在视觉树加载之前,动态的修改了App中的资源,后续的样式应用机制仍然是 framework 默认的。

原文地址:http://www.nikhilk.net/Silverlight-Themes.aspx
- 木野狐(Neil Chen) - 博客园


微软"云计算"产品 Live Mesh英文帐户已开放使用

java060515收录,使用标签:.NET,时间:2008-7-17 15:03:07 | 相关网摘我也收藏

Live Mesh是微软进入发展迅猛的云计算市场的最新举措。所谓“云计算”是指通过网上的中央数据中心,实现PC上的各种应用与服务。目前,亚马逊、谷歌、Salesforce等数十家公司已经建立了计算中心,可以高效处理数据外包业务,并使之成为象电一样,企业可以轻松购买的商品。

北京时间2008年7月18日,微软"云计算"产品 Live Mesh 英文帐户已开放使用,注册地为英文的msn.com和live.com等用户已可以登录mesh。

访问:Mesh
http://www.mesh.com/


Win 7打动用户需要20项功能 放弃32位系统

java060515收录,使用标签:.NET,时间:2008-7-17 15:02:15 | 相关网摘我也收藏

7月16日消息,据国外媒体报道,微软的新一代操作系统Windows Vista让人既爱又恨。尽管在安全、CPU调用和稳定性方面有所提高,但由于存在兼容性等问题,还是遭到了业界的指责。并且,普及率也远远低于预期。目前,很大部分用户仍坚持使用Window XP系统。那么下一代操作系统Windows 7能否打动用户呢?答案是:必须!微软没有退路。以下为Windows 7必须包含的20项功能:

1. 简化和管理启动项,提升系统启动速度

2. 快速启动和关系

3. 集成诊断工具

4. 更好的刻录功能

5. 只开发64位系统,放弃32位

6. 准系统内核,如此前曝光的“MinWin”

7. 提供镜像恢复功能

8. 集成微软工具箱,列出已安装硬件和软件的所有驱动和补丁信息,避免出现兼容性问题

9. 程序缓存技术有待提高

10. 内置浏览器要符合业界标准

11. 尽早解决驱动问题

12. 新增家庭用户授权模式

13. WinFS文件系统应该得以体现

14. 系统版本不要太多,家庭、商业和服务器三个版本足已

15. 图形用户界面设计要能提高工作效率

16. 安装内容可定制

17. 支持游戏模式,好比当前的“安全模式”

18. UAC安全功能需重新设计

19. 虚拟机功能

20. 模块化设计


微软将于10月正式发表Silverlight 2

java060515收录,使用标签:.NET,时间:2008-7-17 15:01:05 | 相关网摘我也收藏

微软表示将于10月正式发表Silverlight 2,目前已释出Beta 2版,可以和Silverlight 1.0版兼容,档案大小仍维持在4.7 MB。

目前在Silverlight Beta 2版中的控制组件已增加到30几个,也更新了不少既有API的功能,例如按钮状态设定、文本块的中文输入选单、数据表单的多列排序等功能。微软表示在10月的正式版中,将会提供超过100个控制组件可供开发人员使用。不过,微软也提醒因为Beta 2新增功能过多,无法执行Beta 1的程序,必须用新版本重新开发.


微软将以订阅方式销售Office 年费70美元

java060515收录,使用标签:.NET,时间:2008-7-7 11:17:04 | 相关网摘我也收藏

微软将从7月中旬开始以订阅方式向消费者销售Office程序,以便把Office软件普及到没有购买这个办公软件的节俭的PC用户。

此举也许还将建立一个平台,让微软把面向消费者的应用程序作为一项服务在网络上提供。据介绍,这个捆绑的软件还将包括微软的Live OneCare计算机安全软件,将在Circuit City的700家商店里出售,每年的服务费是70美元。

微软Office部门的产品经理Bryson Gordon在接受采访时表示,与Circuit City商店签署的协议不是独家协议。这个捆绑的软件还将在其它零售商那里销售,将来还会在戴尔等公司出售的PC中销售。

软件订阅价格在企业中很普通的。但是,这对于消费者还是一个比较新的概念。微软提供的Equipt捆绑软件以前的代号是“Albany”。这个捆绑软件包括Word、Excel、PowerPoint和OneNote、再加上OneCare和一些现有的免费的Windows Live应用程序。

采用传统的方式购买这些软件需要200美元。消费者将来还需要全价购买下一个版本的“Office 14”更换这些软件。据说Office 14将在2009年发布。根据新的订阅模式,升级新版本的费用都在每年的服务费中包括了。


视频软件开发商Gotuit起诉微软 称Silverlight侵权

java060515收录,使用标签:.NET,时间:2008-7-7 11:15:22 | 相关网摘我也收藏

近日,视频软件开发商Gotuit Media在旧金山美国联邦地方法院起诉微软的Silverlight多媒体软件侵犯了其3项专利,这些专利涵盖了视频内容在互联网上的搜索便利性。

去年发布的Silverlight技术是微软挑战Flash和QuickTime多媒体技术格式的撒手锏,经过微软的大力改进,使用Silverlight技术,Windows用户可以通过浏览器观看视频和动画。

Gotuit销售的软件能够让用户在视频片段中添加文本数据,便于用户在视频片断中搜索到自己需要的部分。Gotuit的软件已经为体育画报、美国全国曲棍球联盟等数家知名网站所采用。

Gotuit在起诉书中称,由于Silverlight也是通过键入关键字等资料向用户提供强化视频的方式━━搜索、导航自己需要的视频,并提供个性化的观看体验,所以说Silverlight侵犯了Gotuit的专利。Gotuit起诉书中还称,“微软已经侵犯了我们的专利,现在还在继续侵犯我们的专利。”

Gotuit还将微软NBCOlympics.com上有关2008年北京奥运会的视频点播片断列为侵权行为的证据,因为该站点利用Silverlight对视频片断进行标注,使其搜索性更高。

Gotuit要求法院禁止微软使用这一技术,并赔偿经济损失和诉讼费用。

Gotuit法律顾问斯潘塞·霍斯拒绝就这一诉讼案发表评论。截止到本周四,微软的代表还没有就这一诉讼发表评论。


微软七月安全公告预告:四个重要等级更新

java060515收录,使用标签:.NET,时间:2008-7-7 11:14:56 | 相关网摘我也收藏

微软公布了七月安全公告的预告,我们可以从安全通告中看到本月微软将发布四个重要等级的更新.

其中2个影响Windows,1个是SQL的提权漏洞,1个Exchange Server的提权漏洞.这些漏洞届时都可以被Baseline Security Analyzer检测并更新.下周8日的Patch Tuesday将公布这些更新.

查看原文:Microsoft Security Bulletin Advance Notification for July 2008
http://www.microsoft.com/technet/security/bulletin/ms08-jul.mspx


微软步入后盖茨时代 鲍尔默应作10件大事

java060515收录,使用标签:.NET,时间:2008-7-7 11:14:21 | 相关网摘我也收藏

随着创始人比尔·盖茨(Bill Gates)的退休,微软已经步入以CEO史蒂夫·鲍尔默(Steve Ballmer)为首的“后盖茨”时代.大多数分析师认为,由于交接工作准备得很充分,失去盖茨的微软仍将继续前行.但鲍尔默应该重点做好以下10件事情:

1. 把教育用户作为企业使命来抓

微软的Windows、Word和Excel等产品中功能丰富,但消费者却并不完全了解.其结果就是,消费者耗费大量的时间来解决一些微软产品已经攻克的问题.因此,鲍尔默应该在该领域投入一笔资金,以帮助用户了解微软产品的功能.

2. 不要把技术战略任务完全抛给奥兹

雷·奥兹(Ray Ozzie)对技术的发展趋势确实很敏感,但真正了解微软在未来10年希望给用户带来怎样用户体验的还是鲍尔默.

3. 把微软作为研究案例向其他企业高管开放

经营全球最大企业之一并不是件容易事情,因此,鲍尔默应该向其他企业的CIO和IT高管开放微软,让他们了解微软是如何把技术与商业目标结合起来的.

4. 不要痛骂竞争对手

目前,微软仍几乎垄断每一个市场,因此鲍尔默没有必要像以前那样痛骂谷歌和苹果等其他竞争对手.相反,微软应该把精力放在改善产品和发展业务上.

5. 微软应该推出一项开源项目

多年以来,微软一直在坚持同一种商业模式.事实上,微软应该推出一个开源项目,像Firefox或Linux那样,允许用户进行定制. 微软甚至都不需要商业化推出该产品,但要能对其他企业提供一些帮助.

6. 平稳过渡到Windows 7

Windows Vista已经算是惨败,如果事情进一步恶化,那么结果很难想象.微软的操作系统应该像SAP学习,向用户提供功能包,而不是整个ERP平台.

7. 与开源厂商合作

微软与Novell的合作可谓是开创了互操作性市场的新纪元,微软应该把这种

合作继续推广下去.目前,红帽等开源厂商还在抵制这样的合作,但鲍尔默应该改变他们的观念.

9. 调整并购战略

微软把太多的精力放到收购雅虎上,反而冷落了一些本应收购的企业.从现在起,微软应该提出新的企业搜索战略.

9. 迎合社交网络群体

既然持有Facebook股份,微软就应该为Facebook开发应用.如果微软能够开发出一些应用,使社交网站变得方便、安全,易于与其他应用结合,那么将改变很多人对微软所持有的对互联网反应迟钝的印象.

10. 继续与垃圾邮件斗争

盖茨2004年曾预计,垃圾邮件将于2006年消失.尽管盖茨的预言失败了,但鲍尔默应该帮助盖茨来完成这一任务.



ASP.NET缓存:方法分析和实践示例

java060515收录,使用标签:.NET,时间:2008-6-30 11:34:54 | 相关网摘我也收藏

尽早缓存;经常缓存 您应该在应用程序的每一层都实现缓存。向数据层、业务逻辑层、UI 或输出层添加缓存支持。内存现在非常便宜 — 因此,通过以智能的方式在整个应用程序中实现缓存,可以获得很大的性能提高。 缓存可以掩盖许多过失 缓存是一种无需大量时间和分析就可以获得“足够良好的”性能的方法。

这里再次强调,内存现在非常便宜,因此,如果您能通过将输出缓存 30 秒,而不是花上一整天甚至一周的时间尝试优化代码或数据库就可以获得所需的性能,您肯定会选择缓存解决方案(假设可以接受 30 秒的旧数据)。缓存正是那些利用 20% 付出获得 80% 回报的特性之一,因此,要提高性能,应该首先想到缓存。

不过,如果设计很糟糕,最终却有可能带来不良的后果,因此,您当然也应该尽量正确地设计应用程序。但如果您只是需要立即获得足够高的性能,缓存就是您的最佳选择,您可以在以后有时间的时候再尽快重新设计应用程序。 页面级输出缓存 作为最简单的缓存形式,输出缓存只是在内存中保留为响应请求而发送的 HTML 的副本。其后再有请求时将提供缓存的输出,直到缓存到期,这样,性能有可能得到很大的提高(取决于需要多少开销来创建原始页面输出 - 发送缓存的输出总是很快,并且比较稳定)。 实现 要实现页面输出缓存,只要将一条 OutputCache 指令添加到页面即可。

<%@ OutputCache Duration="60" VaryByParam="*" %>

如同其他页面指令一样,该指令应该出现在 ASPX 页面的顶部,即在任何输出之前。它支持五个属性(或参数),其中两个是必需的。  Duration 必需属性。页面应该被缓存的时间,以秒为单位。必须是正整数。  Location 指定应该对输出进行缓存的位置。如果要指定该参数,则必须是下列选项之一:Any、Client、Downstream、None、Server 或 ServerAndClient。  VaryByParam 必需属性。Request 中变量的名称,这些变量名应该产生单独的缓存条目。"none" 表示没有变动。"*" 可用于为每个不同的变量数组创建新的缓存条目。变量之间用 ";" 进行分隔。 VaryByHeader 基于指定的标头中的变动改变缓存条目。

VaryByCustom 允许在 global.asax 中指定自定义变动(例如,"Browser")。 利用必需的 Duration 和 VaryByParam 选项的组合可以处理大多数情况。例如,如果您的产品目录允许用户基于 categoryID 和页变量查看目录页,您可以用参数值为 "categoryID;page" 的 VaryByParam 将产品目录缓存一段时间(如果产品不是随时都在改变,一小时还是可以接受的,因此,持续时间是 3600 秒)。这将为每个种类的每个目录页创建单独的缓存条目。每个条目从其第一个请求算起将维持一个小时。  VaryByHeader 和 VaryByCustom 主要用于根据访问页面的客户端对页面的外观或内容进行自定义。同一个 URL 可能需要同时为浏览器和移动电话客户端呈现输出,因此,需要针对不同的客户端缓存不同的内容版本。

或者,页面有可能已经针对 IE 进行了优化,但需要能针对 Netscape 或 Opera 完全降低优化(而不仅仅是破坏页面)。后一个例子非常普遍,我们将提供一个说明如何实现此目标的示例:  示例:VaryByCustom 用于支持浏览器自定义 为了使每个浏览器都具有单独的缓存条目,VaryByCustom 的值可以设置为 "browser"。此功能已经内置在缓存模块中,并且将针对每个浏览器名称和主要版本插入单独的页面缓存版本。

<%@ OutputCache Duration="60" VaryByParam="None" VaryByCustom="browser" %>

片段缓存,用户控件输出缓存 缓存整个页面通常并不可行,因为页面的某些部分是针对用户定制的。不过,页面的其他部分是整个应用程序共有的。这些部分最适合使用片段缓存和用户控件进行缓存。菜单和其他布局元素,尤其是那些从数据源动态生成的元素,也应该用这种方法进行缓存。如果需要,可以将缓存的控件配置为基于对其控件(或其他属性)的更改或由页面级输出缓存支持的任何其他变动进行改变。使用同一组控件的几百个页面还可以共享那些控件的缓存条目,而不是为每个页面保留单独的缓存版本。  实现 片段缓存使用的语法与页面级输出缓存一样,但其应用于用户控件(.ascx 文件)而不是 Web 窗体(.aspx 文件)。除了 Location 属性,对于 OutputCache 在 Web 窗体上支持的所有属性,用户控件也同样支持。用户控件还支持名为 VaryByControl 的 OutputCache 属性,该属性将根据用户控件(通常是页面上的控件,例如,DropDownList)的成员的值改变该控件的缓存。

如果指定了 VaryByControl,可以省略 VaryByParam。最后,在默认情况下,对每个页面上的每个用户控件都单独进行缓存。不过,如果一个用户控件不随应用程序中的页面改变,并且在所有页面都使用相同的名称,则可以应用 Shared="true" 参数,该参数将使用户控件的缓存版本供所有引用该控件的页面使用。 示例

<%@ OutputCache Duration="60" VaryByParam="*" %> 该示例将缓存用户控件 60 秒,并且将针对查询字符串的每个变动、针对此控件所在的每个页面创建单独的缓存条目。

<%@ OutputCache Duration="60" VaryByParam="none" VaryByControl="CategoryDropDownList" %>

该示例将缓存用户控件 60 秒,并且将针对 CategoryDropDownList 控件的每个不同的值、针对此控件所在的每个页面创建单独的缓存条目。

<%@ OutputCache Duration="60" VaryByParam="none" VaryByCustom="browser" Shared="true %>

最后,该示例将缓存用户控件 60 秒,并且将针对每个浏览器名称和主要版本创建一个缓存条目。然后,每个浏览器的缓存条目将由引用此用户控件的所有页面共享(只要所有页面都用相同的 ID 引用该控件即可)。 页面级和用户控件级输出缓存的确是一种可以迅速而简便地提高站点性能的方法,但是在 ASP.NET 中,缓存的真正灵活性和强大功能是通过 Cache 对象提供的。使用 Cache 对象,您可以存储任何可序列化的数据对象,基于一个或多个依赖项的组合来控制缓存条目到期的方式。这些依赖项可以包括自从项被缓存后经过的时间、自从项上次被访问后经过的时间、对文件和/或文件夹的更改以及对其他缓存项的更改,在略作处理后还可以包括对数据库中特定表的更改。


ASP.NET Web 应用程序与ASP.NET网站比较

java060515收录,使用标签:.NET,时间:2008-6-30 11:29:15 | 相关网摘我也收藏

●网站编译速度快,使用了增量编译模式,仅仅只有文件被修改后,这部分才会被增量编译进去。

●生成的程序集 WebSite:生成随机的程序集名,需要通过插件WebDeployment才可以生成单一程序集 WebApplication:可以指定网站项目生成单一程序集,因为是独立的程序集,所以和其他项目一样可以指定应用程序集的名字、版本、输出位置等信息

●可以将网站拆分成多个项目以方便管理

●可以从项目中和源代码管理中排除一个文件

●支持VSTS的Team Build方便每日构建

●更强大的代码检查功能,并且检查策略受源代码控制

●可以对编译前后进行自己规定的处理

●对App_GlobalResources 的Resource强类支持(网上说的,还没有了解过)

●直接升级使用VS2003构建的大型系统

WebSite编程模型的优点:

●动态编译该页面,马上可以看到效果,不用编译整个站点(主要优势)

●同上,可以使错误的部分和使用的部分不相干扰(可以要求只有编译通过才能签入)

●可以每个页面生成一个程序集(不会采用这种方式)

●可以把一个目录当做一个Web应用来处理,直接复制文件就可以发布,不需要项目文件(无所谓,只适合小站点)

●可以把页面也编译到程序集中(应该用不到,而且WebApplication也可以通过WebDeployment插件来实现)

两种编程模型的互相转换:

VS2005 SP1内置了转换程序,可以非常方便的从WebSite转换到WebApplication 只需要复制文件,右键执行“转换为Web应用程序”即可。未查到有专门的反向转换工具,但比较后发现如果转换也非常简单。

删除所有*.designer.cs 将*.aspx、*.ascx、*.master页面文件中的 Codebehind="FileList.aspx.cs" 批量替换成 CodeFile="FileList.aspx.cs"


.Net Compact Framework 高级篇—扩展SOAP应用

java060515收录,使用标签:.NET,时间:2008-6-30 11:27:23 | 相关网摘我也收藏

本文主要讲述如何在.Net CF中发送自定义的SOAP消息来调用WebService。可能大家对如何实现自定义的SOAP有一定的了解。但是在.Net CF中,有一些地方值得大家注意。

为何要实现自定义的SOAP呢?以及SOAP的好处在于?

一般调用WebService时,我们可以发送Http信息,也可以发送SOAP1.1/1.2信息。如果我们希望在调用某些方法时只针对于特定的用户时。那通常做法,在调用函数中加入一些判断参数,然后来判断是否是被授权的用户。使用自定义SOAP消息不但可以减少传入参数,可以在该方法调用前,就过滤掉,通知客户端,没有足够的权限。通常,我们可以将这些信息放到SOAP的header部分,传递到服务器端时,解析时,可以验证header部分的信息是否符合。

概念讲述那么多。通过代码来说明吧。

首先定义一个WebService。


1[WebService(Namespace = "http://tempuri.org/")]
2[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
3public class Service : System.Web.Services.WebService
4{
5 public MySoapHeader myHeader;
6
7 public Service () {
8 }
9
10 [WebMethod]
11 public string HelloWorld() {
12 return "Hello World";
13 }
14
15 [WebMethod, SoapHeader("myHeader")]
16 public string GetInfo(string userName)
17 {
18 return string.Format("Hello, {0}", userName);
19 }
20}
该Service中声明了2个方法,其中GetInfo就是验证SOAP的方法。在该Service中提供了一个MySoapHeader,这个是自定义的SOAP头,用于定义一些验证信息。为何这样定义,等下文中叙述。

实现完WebService后,该实现扩展的SOAP信息了。
1 public override void ProcessMessage(SoapMessage message)
2 {
3 switch (message.Stage)
4 {
5 case SoapMessageStage.AfterDeserialize:
6 break;
7 case SoapMessageStage.AfterSerialize:
8 break;
9 case SoapMessageStage.BeforeDeserialize:
10 Check(message);
11 break;
12 case SoapMessageStage.BeforeSerialize:
13 break;
14 default:
15 break;
16 }
17 }
18
19 private void Check(SoapMessage message)
20 {
21 if (message is SoapServerMessage)
22 {
23 MemoryStream ms = new MemoryStream();
24 System.IO.StreamWriter sw = new StreamWriter(ms);
25 StreamReader sr = new StreamReader(message.Stream);
26 char[] buffer = new char[(int)message.Stream.Length];
27 sr.Read(buffer, 0, (int)message.Stream.Length);
28
29 sw.Write(buffer, 0, buffer.Length);
30 sw.Flush();
31 message.Stream.Position = 0;
32 string sb = System.Text.Encoding.ASCII.GetString(ms.ToArray());
33
34 Debug.WriteLine(sb);
35
36 XDocument doc = XDocument.Parse(sb);
37 XNamespace name = "urn:com-appleseeker";
38 XNamespace soapheader = "http://schemas.xmlsoap.org/soap/envelope/";
39 MySoapHeader header = new MySoapHeader();
40
41 if (doc.Descendants(soapheader + "Header").Descendants().Elements(name + "userid").First() == null)
42 {
43 throw new Exception("");
44 }
45 header.userid = doc.Descendants(soapheader + "Header").Descendants().Elements(name + "userid").First().Value;
46
47 string[] temp = message.Action.ToString().Split('/');
48 string methodName = temp[temp.Length - 1];
49
50 if (header.userid == "0345")
51 {
52 }
53 else
54 {
55 throw new Exception("No Access");
56 }
57 }
58 }
这是服务器端的扩展的SOAP处理,必须重写一些方法,其中ProcessMessage中,在做BeforeDeserialize这一步操作时,解析接受到的SOAP消息。通常SOAP会有4部分操作。可以参考代码说列。
在验证消息时,从SOAP消息中取到内容,就是流中的内容,该流只读,可以通过复制到内存中来取得。当然,取道流的内容后,肯定是一个XML格式,通过对XML格式的文件解析方式,取到SOAP头部说含内容。这里我只验证userid=0345时,才能调用。否则则返回一个异常。

客户端部份相对简单。 1 public override void ProcessMessage(SoapMessage message)
2 {
3 switch (message.Stage)
4 {
5 case SoapMessageStage.AfterDeserialize:
6 break;
7 case SoapMessageStage.AfterSerialize:
8 break;
9 case SoapMessageStage.BeforeDeserialize:
10 break;
11 case SoapMessageStage.BeforeSerialize:
12 message.Headers.Add(new MySoapHeader() { userid = "0345" });
13 break;
14 default:
15 break;
16 }
17 }
只是在ProcessMessage的BeforeSerialize前加入头文件的内容。

自定义的SOAPHeader

1 [XmlRoot("MyHeader", Namespace = "urn:com-appleseeker")]
2 public class MySoapHeader: SoapHeader
3 {
4 public string userid;
5 public string username;
6 public string department;
7 }Namespace约定了在header部分的tag,通过定义,我们可以用它来解析。

我们做完了代码上的大部分活,接下来就是配置了,如何让WebService在接收到SOAP消息后,自动来解析呢,只需要在web.config中加入下面配置即可 1
2
3
4
5在add type中,第一个是自定义的扩展SOAP类名,需加命名空间,后面一个是程序集名

服务器端配置完成了。接下来就是客户端部分。
这里介绍下非Mobile程序如何使用,我创建一个控制台程序简单说明下,在客户端部分,有2种方式使用扩展SOAP。
1.可以像服务器端那样,自定义一个SOAP类,然后加入相应信息,再在app.config中加入相应配置即可。
2.在服务器的WebService的方法的Attribute中加入SoapHeader参数,表明可以使用的自定义SOAP头文件内容。
并在WebService中提供一个Public的自定义的头属性。在客户端只需要在调用时对自定义的头属性赋值即可。

在WM中,只能使用第2种方法来实现,不支持第1种方式。 1private void menuItem1_Click(object sender, EventArgs e)
2{
3 localhost.Service service = new SmartDeviceProject1.localhost.Service();
4 service.Url = service.Url.Replace("localhost", "192.168.0.157");
5 localhost.MySoapHeader myHeader = new SmartDeviceProject1.localhost.MySoapHeader();
6 myHeader.userid = "0345";
7 service.MyHeader = myHeader;
8 MessageBox.Show(service.GetInfo("Gordon"));
9}
以上在WM中就能使用自定义的SOAP消息了。各位在实际应用中如果遇到什么问题,可以参考我下面提供的代码。我在做Demo的过程中也或多或少遇到一些问题,大家可以相互探讨交流。

这篇文章的主旨在于,如何在WebService中验证用户信息。
在下一篇文章中,我可能会讲述如何在WCF中实现用户的验证。同样会基于.Net CF,希望大家能够留意。


- AppleSeeker''s Tech Blog - 博客园


详解Silverlight 2中的独立存储

java060515收录,使用标签:.NET,时间:2008-6-30 11:25:33 | 相关网摘我也收藏

独立存储(Isolated Storage)是Silverlight 2中提供的一个客户端安全的存储,它是一个与Cookie机制类似的局部信任机制。独立存储机制的APIs 提供了一个虚拟的文件系统和可以访问这个虚拟文件系统的数据流对象。Silverlight中的独立存储是基于 .NET Framework中的独立存储来建立的,所以它仅仅是.NET Framework中独立存储的一个子集。

Silverlight中的独立存储有以下一些特征:

1.每个基于Silverlight的应用程序都被分配了属于它自己的一部分存储空间, 但是应用程序中的程序集却是在存储空间中共享的。一个应用程序被服务器赋给了一个唯一的固定的标识值。基于Silverlight的应用程序的虚拟文件系统现在就以一个标识值的方式来访问了。这个标识值必须是一个常量,这样每次应用程序运行时才可以找到这个共享的位置。

2.独立存储的APIs 其实和其它的文件操作APIs类似,比如 File 和 Directory 这些用来访问和维护文件或文件夹的类。 它们都是基于FileStream APIs 来维护文件的内容的。

3.独立存储严格的限制了应用程序可以存储的数据的大小,目前的上限是每个应用程序为1 MB。

使用独立存储Silverlight中的独立存储功能通过密封类IsolatedStorageFile来提供,位于命名空间System.IO.IsolatedStorag中,IsolatedStorageFile类抽象了独立存储的虚拟文件系统。创建一个 IsolatedStorageFile 类的实例,可以使用它对文件或文件夹进行列举或管理。同样还可以使用该类的IsolatedStorageFileStream 对象来管理文件内容,

- TerryLee''s Tech Space - 博客园
更详细信息,请点击查看原文


盖茨正式宣布退休 与鲍尔默泪洒欢送会现场

java060515收录,使用标签:.NET,时间:2008-6-30 11:00:55 | 相关网摘我也收藏

据国外媒体报道,微软董事长比尔·盖茨(Bill Gates)向830名微软代表发表了告别演说,正式宣布辞去微软执行董事长的全职工作,并且追忆与史蒂夫·鲍尔默(Steve Ballmer)长久以来的友谊。当鲍尔默亲手交给盖茨一本大剪贴簿作为离别礼物时,两人都忍不住热泪奔流。

  在雷德蒙市微软的一间会议室里,盖茨与鲍尔默并排而坐,娓娓而谈微软历史上的某些时刻。中间他们将话题扯到了IBM,后者的第一批个人电脑装的是微软DOS操作系统,后来IBM采用了自己的操作系统,双方关系紧张起来。

盖茨正式退休,830名微软员工参加了这场欢送会

  盖茨说:“他们拿走了OS 2,给我们留下了Windows——大卫对战歌利亚的故事有了该有的结局。”这句玩笑话让全场830名微软员工哄堂大笑。

  盖茨,这位与保罗·艾伦(Paul Allen)在1975年建立了微软的公司创始人,承认微软今天已是蹒跚而行,不再那么完美无缺。“当我们与重大的变革擦肩而过,当我们没有伟大的领导人进行这种变革,对我们来说就是最危险的事情。这样的事情已经发生过很多次。没关系,但是——越少越好。”

  虽然告别了微软,但盖茨仍将担任非执行主席。他表示,仍将分担鲍尔默及克莱格·蒙迪(Craig Mundie)和雷·奥兹(Ray Ozzie)所选中的项目,其中一项将是互联网搜索业务——微软在这一市场上所占份额落后于谷歌和雅虎。

  “人们可能在想,微软将在互联网搜索市场上有所作为吗?”盖茨说,“我们将是最棒的。”他还再次强调,不愿再参与微软的日常事务。


张亚勤回忆盖茨往事:他有浓厚中国情结

java060515收录,使用标签:.NET,时间:2008-6-30 10:36:40 | 相关网摘我也收藏

编者按:北京时间6月25日晚间,正在美国参加微软公司董事长比尔•盖茨退休告别派对的微软全球资深副总裁、微软(中国)董事长及微软中国研发集团主席张亚勤昨晚通过越洋电话回忆了他与盖茨结识16年的部分往事。

  张亚勤在口述中,从对盖茨的印象、盖茨与中国的关系及展望鲍尔默时代的微软前景等方面向外界分享了很多小故事和细节。最让人印象深刻的是,张亚勤说,盖茨有浓厚的中国情结,并举了多个例子说明。

  本文由张亚勤口述,其中小标题为编者添加。

  我代表微软大中华区送别盖茨

  几天前,我和微软中国的几位同事一起来到了美国西雅图,这里是微软的全球总部,我们来参加盖茨的告别派对。明天(注:北京时间6月26日晚至6月27日)我要参加两场派对。第一场是在白天,由总部的一些员工及从全世界各地赶来的微软同事参加;另外一场在晚上,副总裁(VP)以上级别员工和家属参加。先向大家透露一下,我还会代表微软大中华区向盖茨赠送一件特别的礼物,至于是什么,先保密吧。

  盖茨的告别派对明天就要举办了,他也马上就要退休了,去专注他的慈善事业,但他也不是彻底退休,他还是微软的非执行董事长,每周还要来上一天班。回想起和盖茨打交道的16年,感慨万千。

  盖茨“闪烁着人性的智慧和光辉”

  我认识盖茨是在1992年,那时我还没到微软。初次见面是在亚特兰大的一个展览会上,我们就数字视频的传输和通信展开交流,盖茨把他对技术的理解、对市场的感觉,联系在一起,超越单个技术、单个产品的层次展开探讨,令我印象深刻。

1998年我加入微软后,回国和李开复博士一起创办微软亚洲研究院,2000年我开始担任院长向他汇报,盖茨对软件基础研究工作特别重视,所以和他交流就多了起来;2004年年初,我离开亚洲研究院调回美国,负责微软全球通信及嵌入式系统的开发,也就是现在很多人使用的Windows Mobile智能手机操作系统,那时他成了我的“导师”,这个项目也是直接向他汇报,所以有了更多的沟通。再到2006年,我又回到中国组建微软中国研发集团,并担任主席,我成了盖茨了解中国很重要的一个窗口。

  如果让我用一句话来评价盖茨,那就是他身上闪烁着人性的智慧和光辉。他是一个非常聪明的人,你在和盖茨谈话、沟通的时候,你可以感受到脑力场的发射。他很多次来中国,我都是全程陪同,他有时候问的问题很独特,思维方式和常人不同,有时候简单一句话就讲到我们中国很复杂的问题,涉及文化、历史、政治各个方面。我非常佩服他的智商、他的智力。

  盖茨的技术感觉很好,对产品的感觉很好,对市场等综合因素的把握游刃有余,我觉得这造就了他和别人的不同之处,盖茨简化问题的能力很厉害,不管是技术问题、产品问题还是市场问题,他都会用精炼的语言、很简单地把问题的实质提出来。他对技术、产品本身就有非常深入的理解,在我们讨论问题的时候,完全可以讨论得非常的细、非常深入。

  盖茨的中国情结

  盖茨有很浓厚的中国情结,他在九十年代初的时候,曾经只身一人跑到北京来。他这几年每次来中国都和学生有交流,他总是觉得中国的学生是世界上最聪明的学生,他还问我,为什么中国的学生这么聪明。他来中国有时也和中国一些领导人有些交流,他说中国领导人一定是世界上最强的,我相信他说的真心话,不是外交辞令,因为对他来说,已经没必要再为了什么目的说言不由衷的话了。

  我现在每次见到盖茨,他都会欣然接受我给他“洗脑”。比如十七大之后,我见到他就专门给他传达中国十七大的精神,两会之后我就和他讲讲两会的报告,他对中国很感兴趣,也让他能更多的理解中国。

  奥运会很快就要在北京举办了,他很早就买好了门票,到时候他会来中国看比赛。去年我陪同他参加博鳌亚洲论坛期间,他接受了CCTV的采访,主持人水均益问他来中国看奥运会,是希望中国队赢还是美国队赢,他回答说,乒乓球,肯定是中国赢;篮球,肯定是美国赢,睿智又幽默。

  对鲍尔默领导微软充满信心

  盖茨退休后,微软的担子就要交给鲍尔默了。盖茨和鲍尔默的关系非常紧密,亲如兄弟。鲍尔默是一个非常聪明,时刻饱满激情的人,他在哈佛读书时数学常考第一名,他对市场和销售更可以说有一种天赋。我和鲍尔默也有过很多交往,每次和他开完后,身上的能量感觉就能增加3个分贝。我对鲍尔默的领导充满信心,他将带领微软进入一个新时代。


盖茨今日正式辞职 14位科技界名流临别赠言

java060515收录,使用标签:.NET,时间:2008-6-30 10:32:21 | 相关网摘我也收藏

微软董事长比尔·盖茨(Bill Gates)将于本周五(6月27日,美国当地时间)正式退出公司日常管理工作,以把精力专注于慈善事业.在过去30多年的职业生涯中,虽然盖茨曾与硅谷 IT名流们结下了诸多“恩怨情仇”,但在盖茨临别之际,众多硅谷知名人士仍忍不住主动向盖茨告别,并祝愿他今后在慈善事业上取得新成就.以下就是14名美国IT界知名人士致盖茨离别语(其中包括微软数名高管,排名不分先后,仅为方便阅读):

1、斯科特·麦克尼利(Scott McNealy),服务器制造商Sun董事长:

“我祝愿他今后的事业一帆风顺.我认为他聪明之极.好在他与我本人倒没有什么大冲突,但他确实取得了诸多成就.我觉得他今后的工作担子仍然很重.我愿意看到由他本人来管理盖茨基金会,而不是交给他人看管.我一直认为,对于事业成功的企业家来说,如果他们看到自己的财富被人任意挥霍一空,估计他们至死也不会安宁.”

在被问及是否会想念盖茨时,麦克尼利说:“如果我想念他,也不会有人因此给我点钱用;不过我倒是拿不准他是否会想念我.”

2、史蒂夫·乔布斯(Steve Jobs),苹果首席执行官:

“对微软来说,盖茨引退是一件大事.作为引人注目的退休事件,我个人认为,盖茨此前作出了巨大贡献,他理应受到人们的尊敬.”

3、迈克尔·戴尔(Michael Dell),PC制造商戴尔创始人兼首席执行官:

“在推动标准化计算和新一轮生产力事宜上,盖茨独特的创新能力和远见成为了关键因素.我个人认为,在促使计算机深入到人们日常生活过程中,我们很难找到比盖茨影响力更大的人.”

“对于盖茨的敬业精神,我个人一直非常钦佩.正是盖茨使企业家个人形象更有亲和力.他不仅是一名技术梦想家,同时也是一位商业战略家.多年以来,盖茨向我们展示了他的执着精神,并推动了包括技术创新、公开政策等因素在内的IT产业发展进程.”

“盖茨是屈指可数且已经改变了世界的IT业界领袖之一,正是他使得技术得以普及,从而使这些技术能够被更多人使用.目前我们之所以能开发出改变业界形势的新技术,部分就要归功于盖茨及其微软团队已经建立的良好基础.”

“我个人认为,盖茨最具持续性的贡献无疑将是盖茨基金会.比尔和梅琳达给予了我们诸多人生启示,他们投入大量精力和拿出上亿美元,目的是为了解决全球正面临的最棘手难题.”

“我认为,盖茨仍将一如既往地投入工作.如果非要说有什么不同,那只能说盖茨将把多年投入微软的精力转移到盖茨基金会中,并将更加努力地工作.我们将对此随时加以关注.”

4、马克·库班(Mark Cuban),HDNet和达拉斯小牛队老板,Broadcast.com前首席执行官:

“毫无疑问,盖茨的从业生涯谱写了自己人生传奇,他对世界的巨大影响,其实远高于人们的想像.尽管盖茨留下了许多精彩的故事,但是我最喜爱的那一个,可能连盖茨也不知道.而我自己也曾参与其中.”

“上个世纪80年代初期,Comdex不但为业界会议,而且还是科技人士的休闲聚会活动.在当时举行的一次聚会期间,我正在和几位女孩跳舞.这时她们的一个朋友突然跑来说,得马上离开,去见一位名叫比尔·盖茨的家伙,而他的个人财富高达6000万美元.”

“这是个真实的故事.盖茨,谢谢你给了我努力工作的动机.”

5、米歇尔·柯兹曼(Mitchell Kertzman),Hummer Winblad公司风险投资家:

“我个人猜想,在相对遥远的未来,即使已经没有人记得盖茨本人,及他在微软的角色,所有人仍然会知道盖茨基金会,并了解该基金会对世界所作出的巨大贡献.”

“如果盖茨能够在基金会中投入同样多精力、决心和执着精神,那么他将成为历史上最伟大、永远被人想念的英雄人物之一.盖茨的慈善工作是一个全新领域,我们都将支持盖茨战胜他的新'竞争者'——疾病、愚昧和贫困.”

6、菲利普·卡恩(Philippe Kahn),FullPower科技公司首席执行官,Borland软件公司创始人:

“尽管美国IT产业正由PC时代向苹果iPhone手机和Google时代转变,但盖茨为我们留下了历久弥新的精神财富.”

7、比尔·维特(Bill Veghte),微软在线服务和Windows商务集团高级副总裁:

“我从盖茨身上学到很多有益的东西,而树立雄心壮志是其关键.在这个问题上,盖茨将这样说:'当你考虑某一个问题时,千万不要从数百万的级别去考虑它,而是应该从数亿的级别去考虑.'”

“其次,我认为非常重要、非常有启发意义的一点是:很多人在一生中获得了大量钱财、权力,亦或是在政治和体育领域取得巨大成就.但是对他们来说,这些钱财和权力是否腐蚀了他们的灵魂?”

“有一次,我们曾经开会讨论搜索业务,参与者只有盖茨、我本人以及少数微软高管.在会议过程中,盖茨像我们一样充满热情,他能全面考虑到所有问题.实际上,他本来根本没有必要参加这一会议.”

“要说盖茨对我最有启发的一点是,即使他已经做了很多工作,他的追求、热忱和乐观精神却从未消退过.他支配自己精力、钱财和技能的独特方式值得我们学习.”

8、乔治·科朗尼(George Colony),知名市场研究公司Forrester Research首席执行官:

科朗尼在一则博客中表示:“所谓'建设性垄断'观念,应当是盖茨留给我们的最重要遗产.他并不是技术创新者.以客气点的方式来说,我们可将他称作技术'推广者';如果用不客气的方式,那他就是技术'剽窃者'.盖茨是一个商业模式创新者,但称不上技术创新者.”

“回首过去,盖茨'建设性垄断'看法与发明家托马斯·爱迪生的观念相类似.两者都通过多种方式创造出优秀技术,并使这些新技术能被更多用户使用.尼科拉·泰斯拉(Nikola Tesla,美国发明家)和史蒂夫·乔布斯(Steve Jobs,苹果首席执行官)则可视为同一枚硬币的反面.”

9、罗伯特·迈特卡尔夫(Robert Metcalfe),以太网发明者,网络设备制造商3COM创始人:

“盖茨是个了不起的人.他非常聪明.尽管我曾经激烈地批评过他,但盖茨并不是一个恶魔.我所发表的第一篇专栏文章,就是批评微软的垄断行为.文章当时发表在美国《计算机世界》(Computer World)杂志上.我也因此开始了自己的记者生涯,时间是1991年2月25日.”

“我当时所主持的专栏名为《观点》,而文章标题为《微软是否在滥用自己的权力?》.在此之后,我对微软的垄断问题提出了尖锐批评,因为早在1991年时,我就发现了微软的垄断行为.微软当时推出了Pen Windows产品,目的就是挤垮Go公司.”

“但无论如何,盖茨仍然身如天神.如果注定有人要成为全球首富,那么盖茨无疑是最佳人选.”

10、丹·布里克林(Dan Bricklin),VisiCalc开发者,Software Garden和Trellix创始人兼总裁:

“他对于业界许多事物都具有极大参与勇气.只要是科技活动,他就会前来,并当众展示自己才能.如果你并不是绝顶高手,却执意要在众目睽睽之下显山露水,这的确需要勇气.但盖茨却成功做到了这点.他做了大量对微软来说必须参与的工作.盖茨愿意成为软件产业面向其他领域的代言人,这让我感到非常钦佩.”

“至今我还记得,我曾经参加过一次微软会议.这一会议似乎是关于Pen计算机技术,他们邀请了很多与会者.会议最后在盖茨家中结束,我们可以在盖茨家中自由穿梭……如果换了我,打死我也不会这样做.”

“盖茨愿意为自己所处领域贡献力量,这足以令人印象深刻.此外,盖茨工作十分努力,能够把握自己所做的工作,并把自己所得返还给社会,这为他人树立了优秀榜样.我很高兴盖茨做到这一点,我祝愿他天天心情愉快.”

11、史蒂夫·鲍尔默(Steve Ballmer),微软首席执行官:

鲍尔默在接受美国《新闻周刊》采访时表示:“他不仅仅是比尔·盖茨,他是与众不同的比尔·盖茨.他创建了微软,积累了财富,组建了基金会,并获得了声誉.其他人很难取得他这样的成就.”

“此外,与公司所有技术人员一样,盖茨也在实践中不断成长.盖茨记忆力比我所知的任何人都好.盖茨能涉及如此广阔的领域,像他这样的人我们今后恐怕很难再碰到.”

12、克雷格·穆迪(Craig Mundie),微软研究与策略首席主管:

“在我加盟微软时,所做的一切工作其实都与PC无关.我还记得与盖茨的谈话.他当时表示,'如果我们能够弄明白如何为这些东西编程,那我们肯定能从中赚钱.'这就体现了他的远见卓识,他敢于为自己的直觉下大赌注.”

“我认为,微软到目前所取得的巨大成就,其实都是基于盖茨从长期发展所下的大赌注.自我加盟微软后,就一直能体会盖茨在应对这些新领域时的独特思考方法.”

“我信奉'疑人不用,用人不疑'的准则.作为一名企业家,我相信人才是最重要的因素,你需要找到有用人才.”

“我曾经与内森·麦沃尔德(Nathan Myhrvold,微软前首席技术官)有过接触,也曾与盖茨打过交道.我发现,在关于如何通过技术帮助他人事宜上,我们有着一样的热情.”

“我曾经负责超级计算业务.很多人认为我应当放弃该职位,而去做汽车、电视机或是手表什么的.不过,当时我认为我们将会看到水滴效应,即我们将受到计算机处理速度、摩尔定律以及其他因素的限制.”

“当我与盖茨、麦沃尔德谈及这一看法时,我发现我们是'英雄所见略同'.我们认为,应当为此找到答案,但答案不会自己从天上掉下来.这也我是加入微软的原因.因此我加盟微软,成为当时并不存在的非PC计算部门总经理.”

13、米奇·卡波尔(Mitch Kapor),Lotus创始人,Mozilla基金会会长:

“我记得在Lotus创建之前,曾经与盖茨见过面.有人当时在与微软谈一项交易,盖茨这时驾驶一辆跑车高速行驶而来,他参加会议已经迟到,澡也没洗……这也是他性格中最引人注目的地方.”

“盖茨将自己在技术和商业上的卓越才能进行结合,从而感受到PC软件和硬件的发展趋势.他也因此建立了规模庞大的市场业务.”

“微软一旦认定目标,就能持之以恒加以执行,这当然是他们的优点.但往不好的地方说,那就是微软市场模式不利于正常市场竞争,而那种'不惜万难以争取胜利'的信条,将使大家日子都不好过.”

14、比尔·坎贝尔(Bill Campbell),财务软件开发商Intuit董事长:

“企业家都具备承受风险的素质,盖茨也不例外.在其30多的企业家生涯中,他展示了作为企业家应具有的精神和创新性才能.他改变了全球软件产业格局,并通过辛勤工作而创建了微软这一知名品牌,我对此感到由衷钦佩.


关于ASP.NET; VBS, VB.NET, JS, JS.NET, C# 的体会

java060515收录,使用标签:.NET,时间:2008-6-23 17:55:29 | 相关网摘我也收藏

五年前开始使用ASP, 和大多数人一样,使用VBS。
写了四年以后,也和很多人一样,积累了不少自己管用的方法、函数之类的。

这期间有考虑过学习.NET,但是初步体验了一下ASP.NET,有点深恶痛绝的感觉,尤其是.NET的服务端控件这样的概念。

个人感觉如果一个BS程序员一开始就学ASP.NET的话,一定是件很糟糕的事情,十有八九会搞不清楚什么是服务端什么是客户端。客服端的用户操作只会产生一个HTTP请求,怎么处理,那就是服务器IIS的事情的,最后才是.NET程序执行的问题。 现在却点个按钮直接就触发了 button_Click 事件了,两个字——恐怖!

因为之前一直用VB, 所以尝试用VB.NET做了一些小应用程序,感觉还不错,至少自己用起来不错,开发很方便。 .NET里面我最喜欢的就是 WebClient ,还有必要时候的杀手锏 WebRequest ,如果没有这两个东西,或许一直就不会去学.NET,用.NET了。

零八年初换了工作,新公司需要开发、修改一些电子商务网站,中间尝试招了几个程序员,面试的时候,问了些问题:

问:“你用什么语言写ASP?VBS还是JS , ASP , 不是ASP.NET”
答:“C#”
……
问:“你确定自己说的是ASP,不是ASP.NET?”
答:“嗯”
……
问:“那你用什么写ASP.NET,C#,还是VB.NET?”
答:“JavaScript”
问:“不是吧,我是说ASP.NET,你用JS写.NET?”
答:“是啊,VS不支持JS,编译的时候会报错,不过你直接运行是可以的!”
……


后来这个程序员来公司体验了半天就走了,留下我一个人在那里郁闷。
他走了以后,因为用VBS写ASP写了好多年了,自己都腻了。所以决定搞些不一样的花样。

用JavaScript写ASP .
因为之前一直用JS写浏览器脚本,对于JS的神奇object情有独钟,再加上判断null的方法是如此方便: if(obj==null).... 比起VBS,不知要爽多少倍。
可是一直没有用JS去写ASP,因为JS的时间操作让我望而生畏。
所以要解决的第一个问题就是封装时间类。用惯了VBS函数的我在使用new Date()的时候就在一个劲儿的抱怨,妈的,JS真烦。可是还是很喜欢。
就这样用JS做了一个电子商务的订单处理系统。

用JSCRIPT8写ASP.NET
后来无意中在MSDN上看到JSCRIPT8,也就是JS.NET的介绍,马上激动地跑过去将JS写的ASP的扩展名全部换成了.ASPX ,错误是不可避免的,不过在修改了
若干个小地方之外,奇迹般的在原有的JS写的ASP文件里, new WebClient() 成功了!

几乎是一鼓作气的,我把页面结构也换成了.net 的样子, 每个页面头部 inherits 一下。 但是,整个过程依然使用的new ActiveXObject("Adodb.Connection")
因为实在不喜欢DataSet的复杂操作。

因为VS开发环境不支持JS, 所以所有代码都是在EditPlus里面写的,把ASP默认语言改成JAVASCRIPT,倒也用得挺方便。实在有冷僻的方法记不住命名空间,就打开VS“提示”一下。

这期间我疯狂得喜欢上了JSCRIPT8,感觉用起来真他妈爽。 JS语言风格+.NET的强大支持, 怎一个爽字了得。 处理大表单的时候,需要添加表单域的时候随便在类里面加个属性来接收它就可以了,处理完数据,再扔到数据层的类里面 foreach 一下双方的类字段,根据字段类型的不同产生不同的赋值SQL, 最后连要赋值几十个字段的SQL语句都不用写了, 直接 foreach 出来了。

用C#写ASP.NET
又对Jscript8疯狂了一段时间以后(甚至注册了jscript8.com的域名),我开始郁闷了。原因,看官您百度,谷歌一下jscript8或者jscript.net关键词就知道了。国内使用jscript8的人凤毛麟角,好不容易在卓越上看到一本jscript.net教程,还“缺货”。 只有那么几篇介绍性的文章,没有发现一个使用JSCRIPT8的同行者。国外,Pool English……

公司还指望我找几个程序员进来带他们,妈的,自己用那么冷僻的语言,怎么招人啊,总不能要求别人都来跟着我疯学jscript8吧。 而且,vs里面虽然有js的编译器jsc.exe,可是毕竟开发环境不支持它,而且jsc.exe手动编译很麻烦,虽然手动写了调用编译的小工具,可是遇到类互相引用的,编译器就说找不到引用了。都这样了,鬼知道微软哪天就把他给从.net行列里面除名了……

郁闷了一段时间以后,我终于决定使用C#了。
这些我就不写了,我相信这里的朋友对此都要比我资深。
现在使用起来还不错,已经使用它又做了两个复杂的订单处理,还有个人写了个采集QQ空间的程序(www.afei.name)。应该还会一直用下去了。

写在最后的
最后得出的结论是,
1. 没有最好的语言,只有最喜欢的语言。就好像谈恋爱的人“情人眼里出西施”一样。

2. 每种语言都会有优点、缺点,一旦你使用哪个习惯了,就会对其他的生疏(就像我现在已经对用了七八年的VB有些不习惯一样,现在连应用程序都会用C#写了),在几种语言之间切换还是蛮痛苦的。

3. 多些思考,任何一种语言基本上都能实现你想要的东西。

4. 多学几样没坏处,起码不会找工作的时候因为没用过某种语言而被淘汰,而且我相信真正的程序员之间的交流应该是不分语言的。

5. 深夜的,我要睡觉了, 上了两个月的夜班,明天开始上白班了(但愿我能起得来……)

疯子阿飞 - 博客园


如何用好.NET 的Indexer (索引器)

java060515收录,使用标签:.NET,时间:2008-6-23 17:53:07 | 相关网摘我也收藏

受到惯性影响,我们常常把indexer作为一个仅仅按照编号反馈结果的入口。
但就如SQL 中的where, 我们其实可以做很多。

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication2
{
class C
{
float[] temps = new float[10] {
56.2F, 56.7F, 56.5F, 56.9F, 58.8F, 61.3F, 65.9F, 62.1F, 59.2F, 57.5F };

public float this[int index]
{
get { return temps[index]; }
set { temps[index] = value; }
}

public string this[string index]
{
get { return index; }
}

///
/// 可以提供类似 Federated PK的功能
///
///
///
///
public string this[string index, int i]
{
get { return index + i; }
}

///
/// 已经可以非常类似SQL语句中Where子句的效果
///
///
///
public float this[Predicate predicate]
{
get
{
float[] matches = Array.FindAll(temps, predicate);

#region 输出中间结果
string[] info = Array.ConvertAll(
matches,
delegate(float f)
{
return Convert.ToString(f);
}
);
Console.WriteLine(string.Join(",", info));
#endregion

return matches[0];
}
}

///
/// 已经可以非常类似SQL语句中一组Where子句的效果
///
///
///
public float this[params Predicate[] predicates]
{
get
{
// 具体实现可以参考上面的例子,基本上和我们写SQL的Where类似
// 具体实现略过
return -1;
}
}

}

class Program
{
static void Main(string[] args)
{
C c = new C();
Console.WriteLine(c[4]);
Console.WriteLine(c["Second"]);
Console.WriteLine(c["Second", 2]);
Console.WriteLine(
c[
delegate(float f)
{
return f > 62F;
}]);
}
}
}

来自于博客园 作者:阿飞


《财富》:"后盖茨时代"微软将何去何从?

java060515收录,使用标签:.NET,时间:2008-6-23 15:32:59 | 相关网摘我也收藏

美国知名财经杂志《财富》今天刊登了深度分析文章指出,微软董事长比尔·盖茨(Bill Gates)将于本月底退出公司日常管理工作,那么没有了盖茨“撑腰”的微软,今后能否继续谱写该公司多年来取得的辉煌市场业绩?

微软董事长比尔·盖茨(Bill Gates)将于本月底退出公司日常管理工作

“后盖茨时代”

今年3月底,微软130多名高管在西雅图市北部的一处旅游胜地召开会议.这也是盖茨和商务软件部门总裁杰夫·雷克斯(Jeff Raikes)的告别会(雷克斯定于今年9月卸任).会议进行期间,微软首席执行官(CEO)史蒂夫·鲍尔默(Steve Ballmer)屡次哽咽而说不出话来.在努力控制自己情绪后,鲍尔默说:“盖茨、雷克斯与我共事的时间最长,他们就像暗夜中的明星,指引着我能够昂首前行.”

今年7月1日,盖茨将正式退出微软日常管理工作,以把精力专注于慈善事业.但盖茨一走,外界禁不住要问:微软今后能否继续保持市场增长?鲍尔默是否有能力引领微软成功杀入具有巨大增长潜力的网络广告市场?一句话,在没有了盖茨“撑腰”前提下,微软还能否继续扩大其市场优势?

外界提出这些疑问,自然也有他们的理由.首先,鲍尔默今年2月1月向雅虎发出了收购请求,但却没能与雅虎达成交易(至少目前如此).其次,微软去年发布了新款Windows操作系统Vista,但却遭到市场和业界人士的激烈批评;再次,以 Google代表的互联网公司在网络广告领域取得了骄人业绩,而微软在该领域却没有多大作为.所有这些,都不由让人怀疑,鲍尔默是否缺乏足够的管理能力和战略眼光.

不仅如此,最近几年中,微软老竞争对手苹果也以其iPod音乐播放器、iMac个人电脑及 iPhone智能手机在市场上占尽风头.市场研究公司IDC的统计数据显示,今年第一季度期间,苹果在美国个人电脑市场的份额已由去年同期5.1%增至 7.4%.尽管如此,微软自身实力也更为强大.华尔街分析师估算,在微软刚刚结束的2008财年中,该公司营收增长了18%;利润增长了27%,达180 亿美元.

外界人士认为,由于手中持有充足的现金,微软势必会采取更为主动的市场战略.对于苹果的进攻,微软此前表示,将于今年下半年再次加大对Windows品牌的推广力度.虽然微软没能把雅虎收为己有,但鲍尔默此前表示,将不惜投入大量资金组建微软互联网业务,以在该领域向Google发起挑战.虽然这些行动将在盖茨退出后开始实施,但鲍尔默称,虽然盖茨届时已经退出,但微软在实施这些战略时,绝不会“缩手缩脚”.

权力分工

事实上,微软“后盖茨时代”早已开始.1998年,鲍尔默成为微软总裁,2000年担任公司 CEO.2004年,盖茨曾私下里告诉鲍尔默,自己希望抽身而退.2006年,盖茨公开宣布,将于今年6月底正式退出微软日常管理工作.在谈及自己近年来在微软的角色时,盖茨表示:“我其实是微软第二号人物,在公司所有市场战略制定事宜上,我已经不再是决策者.”

当然,在产品开发和技术战略事宜上,盖茨也需找到自己的接班人.正因此如此,他与鲍尔默同意,把盖茨的技术开发管理权一分为二.2005年,微软收购了Groove Networks公司,并把该公司创始人雷·奥兹(Ray Ozzie)收至麾下.不久后盖茨便对外宣布,由奥兹接任自己的首席软件架构师一职.对于盖茨原先另一半技术开发管理权,则由克雷格·穆迪(Craig Mundie)来担任.

盖茨之妻梅琳达·盖茨(Melinda Gates)称,盖茨每次谈到微软高管交接事宜时,都毫无例外地表示,如果不是对鲍尔默感到十分放心,盖茨肯定不会轻易退出微软日常管理工作.微软市场营销部门主管米奇·马修斯(Mich Mathews)表示,鲍尔默担任CEO八年以来,已经积累了丰富的管理经验.

马修斯还表示,在担任微软CEO之前,鲍尔默经常是“每事亲躬”,但后来已逐渐学会从大局考虑和全盘处理问题.虽然鲍尔默本人并不精通编程,但他的数学能力并不比盖茨差多少.微软服务器和工具部门主管鲍勃·穆格里亚(Bob Muglia)对此表示:“鲍尔默的脑子就是一台计算机.”

过去数年中,微软多名资深高管成为鲍尔默的有力助手.其中包括Windows和在线服务部门主管凯文·约翰逊(Kevin Johnson)、商务部门主管斯蒂芬·埃洛普(Stephen Elop)、服务器和工具部门的穆格里亚、娱乐和设备部门的罗比·巴赫(Robbie Bach)等等.除任用微软原高管外,鲍尔默还大力从外部企业引进“新鲜血液”.

巨大挑战

鲍尔默此前表示,力争在2009年期间,使微软营收年增长率达15%,也就是让微软当年再增加40亿美元的税前营业收入.而随着微软市场规模的扩大,该公司今后还能否继续保持市场增长活力?多数华尔街分析师认为,并不特别看好微软的市场增长前景,称微软2009年市场增长率为13%左右,2010年会降至10%.

目前微软核心收入来源仍为其Windows操作系统业务.投资银行高盛(Goldman Sachs)发布的数据显示,尽管外界对Vista指责颇多,但微软2008财年中,Windows销量仍增长了11.3%,增至167亿美元;而且在这部分营收中,其利润率高达75%.除美国市场外,微软一直致力于进军全球市场,尤其注重东欧、拉丁美洲等新兴市场.

在俄罗斯市场为例,该国为微软第五大市场.微软首首席财务官(CFO)克里斯·里德尔 (Chris Liddell)透露,2008财年期间,微软在俄罗斯市场销售额增长了100%.微软还表示,目前全球非英语国家的Windows用户量已超出英语国家相应用户量.由此看来,微软并不担心其Windows业务,而是考虑如何使仍陷入亏损的互联网部门进入盈利阶段.

盖茨此前表示,自己退出日常管理工作后,仍将致力于微软搜索等互联网产品的开发.仅此一点就充分说明,微软希望能在互联网产业领域占据优势地位,并蚕食Google既有市场份额.据说盖茨在公司内部会议上经常说的一句话是:“我们很快有望在搜索市场份额事宜上打开局面.”话虽如此,与Google和雅虎相比,微软当前搜索市场份额仍然很低.

为进军网络广告市场,微软决定进行巨额投资.鲍尔默说透露,今年期间,微软将投资170亿美元,用于组建大型数据中心和购买服务器等事项.去年5年中,微软已投入大量人力物力,以加强搜索技术本身的开发.业界人士称,从技术角度看,微软搜索实力其实与Google的距离相差并不大.

雅虎交易

但技术再好,如果没有大量用户使用,搜索引擎无法带来巨大流量;而没有流量,则提高网络广告营收就只能是一句空话.互联网流量监测机构comScore此前公布的数据显示,今年5月期间,微软在美国搜索市场的份额已由今年1月的9.8%降至 8.5%.与此同时,Google今年5月的相应份额高达62%,雅虎则为21%.

业界人士指出,在搜索技术开发上,微软致力于专门化搜索,如地图、视频和图片搜索等等.但在市场操作过程中,微软这些技术并不能达到使Google用户分流目的.这或许表明微软在搜索技术开发大方向上存在失误.当然,微软最近正大力加强其 Live Search品牌推广工作,其中就包括与全球第一大PC制造商惠普达成使用协议,将在惠普所销售PC机上把Live Search作为默认搜索引擎.

鲍尔默表示,将致力于微软互联网业务的“规模化发展”.这也就是微软为何向雅虎发出收购请求的根本原因.如果微软能成功收购雅虎,就能使微软搜索流量大为上升,从而使网络广告营收得以提高.但雅虎上周宣布,已与Google达成一项合作协议,今后雅虎将在其主站中投放Google广告.如果该交易能得到监管部门放行,则无疑会对微软构成更大压力.原因是Google与雅虎合作后,将可借机提高网络广告的收费标准.

由于微软没能把雅虎收为己有,导致一些外界人士对鲍尔默的能力产生怀疑.由于雅虎搜索本身具有很高知名度,如果微软能收购雅虎,就能使自己搜索实力立即得以大幅提高.在今年2月1日的收购要约中,鲍尔默的出价为446亿美元,比雅虎当时股价溢价 62%.虽然鲍尔默的开局不错,但最终却没能与雅虎达成交易.

失败之举

在经过数月的谈判后,鲍尔默同意把出价提高到475亿美元,但雅虎CEO杨致远要求鲍尔默再每股提高1~2美元(即再增加57亿美元左右).但鲍尔默当时表示,雅虎实际价值不值得他再加价.5月初,微软宣布撤回收购雅虎要约,并宣布双方谈判已经结束.但到了5月18日,鲍尔默还是不甘心,又与雅虎展开会谈,但提出的方案是仅收购雅虎搜索业务,即出资10亿美元收购雅虎搜索,并向雅虎投资80亿美元,以获得雅虎部分股份.但不幸的是,该提议再次遭到了雅虎的拒绝.

由于没能收购雅虎,鲍尔默表示,今后微软将致力于提升互联网业务实力,其途径有两个:一是通过内部开发方式加强实力,二是收购外部规模较小的搜索技术公司.但一些业界人士却认为,既然微软真心想收购雅虎,鲍尔默为何不直接满足杨致远的要求,一次性提高报价后,就能把雅虎收为己有,这样做其实更干脆利落.

知名市场研究公司Forrester Research首席执行官乔治·科朗尼(George Colony)对此表示:“既然雅虎是微软收购的首选目标,为何鲍尔默不全力促成交易?这说明他在这件事情上做得很失败.”他认为,除非微软今后再次向雅虎提出收购请求,否则按鲍尔默所说的其他途径,微软在搜索市场上仍将远远落在Google后面.

品牌受损

在微软与Google正面作战的同时,苹果也向老竞争对手微软发起了挑战.前不久苹果曾发动一场市场营销活动,称Vista功能很弱,并鼓动Windows用户转投Mac阵营.市场营销公司CoreBrand此前曾发布报告称,微软2008年全球品牌知名度已降至第59位,而2004年其排名还在第11位.CoreBrand称,之所以微软排名出现下降,部分原因就是苹果发起的广告活动所致.

苹果对微软Vista的“贬损”也不无道理.Vista上市后,企业用户和消费者纷纷表示,该产品存在大量硬件、软件不兼容问题.微软高层自己后来也承认了这一点.如此一来,Vista在微软产品中扮演了一种很尴尬的角色.正因为如此,微软已把其推广重点转移到下一代操作系统Windows 7上面.

微软将在今年下半年展开大规模Windows 7市场营销活动,目的是对苹果的“进攻”予以反击.这次市场营销活动的内部代码为“FTP168”(FTP即“让人们获得自由”的英文缩写).据悉,为了给苹果予以沉重打击,鲍尔默下令为FTP168工程追加2亿美元活动资金.通常情况下,微软很少为还未开展的项目追加预算资金.

今后18个月内,微软将相继推出三款Windows产品,其中Windows 7操作系统为主打产品,再辅以新款Windows Mobile手机操作系统和升级后的Windows Live服务.值得注意的是,这三款产品分别代表了微软在PC、手机和互联网三大领域的产品开发方向,而且这三款产品将齐头并进,互为依托.

无人替代

分析人士指出,尽管微软会采取上述诸多新战略,但无论如何,盖茨在微软的地位将无人可以替代.鲍尔默对此也表示,虽然盖茨将退出日常管理工作,但他多年来带给微软的成功管理经验仍将被继续执行.对于技术开发团队,盖茨已指定了雷·奥兹和克雷格·穆迪两位“继承人”,从而保证了微软各项技术战略能落到实处.

那么没有了盖茨“撑腰”的微软,今后能否继续保持其市场增长活力?微软一些内部员工称,与盖茨相比,鲍尔默个人能力其实更胜一筹.上个世纪80年代,盖茨之所以极力要求鲍尔默加盟微软,主要原因就是看中了鲍尔默的管理能力.从这个角度上讲,微软今后仍将继续生存下去,虽然具体操作手法或许与盖茨不同,但该公司将力争把自己打造成盖茨所预想的成功企业.



鲍尔默展望盖茨引退后微软及行业未来

java060515收录,使用标签:.NET,时间:2008-6-23 15:30:50 | 相关网摘我也收藏

本月底,比尔·盖茨即将从微软的全职管理角色中引退,微软首席执行官斯蒂夫·鲍尔默接受了《金融时报》的专访,就比尔·盖茨引退后其生活目标、微软在互联网搜索业务方面的发展方向以及计划等进行了阐述.以下是访谈内容:

《金融时报》:我们看到,你最终赢得了这场胜利.现在我们想知道下一步你将如何开展工作.

鲍尔默:我会坚持向前、向上.是的,向前、向上.

《金融时报》:比尔·盖茨即将从微软的全职管理角色中引退,这意味着什么呢?

鲍尔默: 我想应该可以认为微软失去了一个象比尔这样的天才.但是,微软的企业文化是建立在很多事情上的,而不仅仅只是基于领导者的个人特质.这种文化建立在领导者个人特质以及我们已拥有的经验之上,建立于我们所有的成功和失败之上.从某些角度而言,它无关乎公司的领导者说了些什么,而是所有发展方向、经验、成功和失败的积累.企业文化是由其自身逐步建立发展而成的.

我相信,比尔在公司留下的遗产会一直持续下去,这其中包括很多,比如“比尔价值观”—人才和团结.我认为比尔的离去不会真正有损于微软文化.我已在沃尔玛看到这一点,我是说虽然山姆-沃尔顿已经离开了相当长的一段时间,但沃尔玛文化还以很多方式存在.因此,我真的认为(比尔·盖茨的离去)不是一个很大的问题.

《金融时报》:那你在个人方面是如何作好准备的?

鲍尔默:(在大学里)我们必须阅读马克斯·韦伯在领袖路线主义路上的一些著述,这些内容是关于政府在这种情况下如何继续保持前进方向,以及如何在一个具有领袖气质的领导人之后进行变革的.因此,可以说我已经考虑过一点点了,主要就是取其精华去其糟粕,然后再来研究这一问题.事情本质很重要,就是要向前发展,并且让员工们也一直向前发展.这是一个有趣的变化.怎么说呢,是比尔开创了微软公司,但是对于微软的每一个来说,微软是比尔的,但同时也是我们的.因此,从这个角度而言,我们并不是在传承这个公司,我也不应该被称作比尔后的第二代.我感觉相对于我们的员工来说,我也是第一代.也就是说,我虽然不是比尔,但我有第一代领导人的仙尘撒在身上.

《金融时报》:微软的股价已经好几年没有涨了,这是为什么?

鲍尔默:我认为,总体来说,我们和大多数大盘股并没有什么不一致.(而且)对所有公司来说,总是会有这样的时期,即在外界预期会大幅增长的期待下,公司股价会涨到很高,然后你会需要一段时间来向外界展示这一过程,也就是需要时间去实现这一预期增长.这就是市场所要做的,它会在得到利润真正产生之前,就抬起你的股价,然后这一价格就会保持一段时间,直到你以超出市场期待的速度可能再次实现增长时,股价才会进行又一轮增长.

因此,我认为我们已经按照上世纪90年代后期人们所期待的那样实现了我们的发展,而现在人们正在认真考虑下一步我们会发展到什么样的地点.这种考虑要想得出正确结果与三到四个关键问题有关.比如,微软是否会在其建立的传统业务领域继续保持强势?微软是否有能力去涉足更大更新的业务,如在线业务、电视或以及移动电话业务等?微软是否还准备继续大刀阔斧地推进公司业务发展?微软是否有能力真正获取新兴的但充斥盗版软件的市场吗?

你知道我们的股价有过起落.我们发表收购雅虎的要约,这稍稍影响到股价.因为投资者会努力去思考,他们将怎样在在线业务上取得成功,会进行什么类型的投资,他们能创造多少价值.当然,我很看好我们的愿景,我也对我们的结果感觉满意.按照过去五年里我们所取得的利润增长来看,我们在大多数工业领域有了超水平的发挥.

《金融时报》:关于对雅虎的收购问题,实际上不少人都私下认为你应该被采取更极端的行动.你认为这种反应公平吗?

鲍尔默:不,那是不正确的.或许有人认为那可能是公平的反应,但我不能真正将其视为公平.不过,从某种意义上来说,在线业务是我们进行交易的最好选择,不是吗?因为,在这个领域,我们比较小,而其他人则很强大.既然有这么个市场摆在那儿,那我们只有一条路可走,那就是向前,向上,向上!

我们认为我们能通过某种创造价值的方法来促进顶层发展加速.其实总的来说,雅虎并没有采取在线策略.购买雅虎只是我们加速自身在线业务战略发展的一个途径.可是,他们不想卖给我们.你知道我们在金融方面是有严格纪律的.这很可笑,因为我们是公司的创建者.我想股东们想知道是否我们真正关心为股东们创造价值,但我认为在这方面我们比起95%的其他公司要自律得多.

《金融时报》:从微软在涉足搜索业务相对滞后的问题上,我们可以得出哪些教训?

鲍尔默:我想我们必须保持敏捷状态.我承认我们在滞后进入搜索业务方面有责任.首先因为我们没有对这种业务模式进行深刻研究.我对谷歌在搜索的业务模式上进行的创新表示赞许.他们在这方面干得不错,所以他们才会取得一些胜利.我想我们犯了一个错误,我们以前谈过这个问题,我们的错误在于在发布 Windows后,我们弱化了对其它事物做出反应的能力,实际上在这5年时间里,我们的大部分的研发资源都处在自我封锁状态.这并不意味着一切事物都应该有6个月的周期,我并不相信这个,但我们的确应该在研发问题上表现出更强的敏感性和弹性.

《金融时报》:现在你如何处理搜索业务?

鲍尔默:我想我们现在要做三件事.有一些事情,正如我们自己所说的那样,只要我们还想留在局中,就必须冒风险下注.这三件事是:相关性,资本支出以及反应性.有一些领域需要我们表现得与众不同,并让Google去追赶我们.还有一些领域,我们要尽力去主动改变其中的规则.这样,我想谷歌将不得不去决定是否还要跟着我们一块儿玩.比如,如果我们的Live CashBack成功地话,那么谷歌就将被迫考虑是否也参与玩这么一个游戏.(注:Live cashback是微软上个月新推出的一项服务,网络用户通过Windows Live Search 进行商品搜索和购物,微软则提供现金返还优惠)

《金融时报》:Live CashBack是不是你们用来买市场份额的一个招数?

鲍尔默:不是.呃,我也不知