ASP中Server对象的功能,在ASP.NET中由HttpServerUtility类来实现。该类型的实例在AS.NET开始处理请求时创建,之后被存储在请求上下文中。HttpServerUtility拥有大量辅助方法,通过HttpContext对象的Server属性暴露给模块或处理程序(包括global.asax、页面和Web服务)。

HttpServerUtility类的属性

  该类提供了两个属性:MachineName和ScriptTimeout。MachineName属性能够返回当前服务器的计算机名称。ScriptTimeout属性获取或设置处理请求占用的最长时间(以秒为单位)。该属性接受一个整数,默认值为90。若页面在debug=true状态下运行,该属性会被设为趋于无穷大的值。

  在动态创建的代表页面的类中,ScriptTimeout属性会自动在其构造函数显式的设置。

HttpServerUtility类的方法

  下表列出了HttpServerUtility类的所有方法:

  HTML和URL编码针对的是字符,旨在确保被传送的文本不会被接收它的浏览器错误识别。具体来讲,HTML编码会将<、>、&和引号分别替换成等价的HTML实体,如&lt;、&gt;、&amp;和&quot;。该过程还会对空白、标点符号及HTML流中不允许出现的其他字符进行编码。而URL编码指在修正通过URL字符串进行传输的文本。在URL编码时,特殊字符也会被其他实例取代,但这些实体与HTML编码所使用的不同。

  自ASP.NET 2.0开始,该类又增添了两个静态方法,分别用于对token进行编码和解码。UrlTokenEncode方法接受包含Base64数据的字节数组,能够将其转化为URL方式的编码的标记。UrlTokenDecode能够执行反向转换过程。

嵌入其他页面的结果

  Execute方法允许我们将外部页面作为子程序执行。当执行到Server.Execute后,控制权会被传给指定的页面。当前页面的执行会被挂起,转而激活外部页面。子页面生成的响应文本会被捕获,并根据所使用的Execute重载方法进行处理。下表列出了Execute方法的重载方法:

  如果指定了TextWriter,那么子页面的响应文本会缓存在该编写器对象中,这样可以自由管理主页面的输出。下例展示了这种效果--主页面生成文本为粗体,而子页面的输出为普通字体,夹在主页面的两行输出之间。

void Page_Load(object sender, EventArgs e)
{
StringBuilder builder
= new StringBuilder();
builder.Append(
"<b>Response generated before Execute is called</b><hr/>");

StringWriter writer
= new StringWriter();
Server.Execute(
"child.aspx", writer);
builder.Append(writer.ToString());

builder.Append(
"<hr/><b>Response generated after the call to Execute.<b>");

Label1.Text
= builder.ToString();
}

  Execute方法的内部实现颇为有趣。主页面和子页面由同一个HttpApplication对象运行,好像它们处理的是同一个请求。Execute的工作原理是一种上下文切换。首先,该方法会从应用程序工厂获取一个HTTP处理程序,以便为新请求服务。主请求的原始处理程序会被缓存,新的处理程序会取代它。子页面继承其父页面的上下文,执行完毕后,会Session和Application的任何更改会立即对主页面生效。

  由于处理程序的切换不需要创建处理请求的新对象,因而整个操作极为高效。当子页面返回后,原始的处理程序会被恢复。主页面的执行会从其暂停的位置继续执行,但使用的上下文是继承于子页面的。

  ASP.NET会直接调用Execute方法指示的处理程序,而不会应用任何身份验证与制空权逻辑。如果您的安全策略要求客户端拥有访问该资源的权限,那么应用程序应重新进行授权。我们可用Response.Redirect来替代Execute,从而强制进行重新授权。若Redirect被调用,浏览器会向系统发出新的请求,这通常由IIS和ASP.NET进行身份验证和授权。另一种方法是通过定义角色并在应用程序调用Execute方法前检查用户角色,以此来验证用户是否有权限调用子页面。

服务器端重定向

  Transfer方法与Execute方法的区别在于,Transfer方法在执行完指定页面后,会终止主调页面的执行。新页面的执行效果如果最初请求的页面。Transfer方法有以下3个重载方法:

public void Transfer(string);
public void Transfer(string, bool);
public void Transfer(IHttpHandler, bool);

  string类型的参数用于指定目标URL。bool类型参数用于指定QueryString和Form的处理方式--如果为true,这两个集合会被保留,否则都被清除。IHttpHandler类型参数可直接指定要调用的HTTP处理程序。

posted on 2011-04-24 00:11  辛勤的代码工  阅读(817)  评论(0编辑  收藏  举报