日期:2014-05-18  浏览次数:20382 次

====关于Server.Transfer操作嵌套SSI指令页面的文件===
现在假设有三个页面,内容分别如下:

1.test.shtml:
<h1> test1 </h1>
<!--#include   file= "test2.html "-->

2.test2.html
<h1> test2 </h1>

3.test.aspx
<%@Page     Language= "C# "   %>
<script   type= "text/C# "   runat= "server ">
void   Page_Load()
{
        Server.Transfer( "/testssi/test.shtml ");
        //Response.Redirect( "/testssi/test.shtml ");
}
</script>

将这三个文件放在IIS的同一个目录下,然后请求:
http://localhost/test.shtml
显示结果是:
test1
test2

但是如果请求http://localhost/test.aspx,显示结果就只有test1,test.shtml中的SSI指令无法执行。

如果在test.aspx中使用Response.Redirect()则可以,很奇怪,Transfer到底是什么原理,因为现在我想采用Transfer屏蔽服务器端执行路径。

------解决方案--------------------
1.
首先,我要声明的是,对于 SSI 我一点都不熟悉,没有实践过,出于好奇,自己找了点资料,分析了一下。
希望大家指出纰漏之处。谢谢!

2.
经测试,确实出现 LZ 的情况

3.
MSDN 中对 Server.Transfer 方法解释中有这么一段:

在此情况下,服务器只是将当前源页的上下文传输给目标页。然后目标页呈现在源页的位置。源页和目标页必须位于同一 Web 应用程序中。

对 Response.Redirect 是这么说的:

可以通过调用 Redirect 方法以编程方式重定向(即无需用户干预,强制浏览器打开新的页)。该方法向用户的浏览器发送命令,由浏览器获取目标页。调用 Redirect 方法是单击超链接的编程等效形式,也会生成对目标页的新的请求(HTTP GET 命令)。

因为 SSI 指令是需要专门的 SSI 解释程序处理的,当 Web服务器(这里是IIS)接受到具有预定义标志需要 SSI 指令解释的请求(通常是具有 .stm、.shtm 和 .shtml 扩展名的文件),那么它就交由专门的 SSI 解释程序处理(通常为 Ssinc.dll)。

那么,
对于 Server.Transfer 因为是服务器(这里并不是IIS,因为执行Server.Transfer 的时候已经交由 asp.net 进程处理了,我们可以称之为应用程序服务器)进行的重定向,因此,并不识别 .shtml,也没有 SSI 指令的解释,所以就按原样输出。

对于 Response.Redirect ,按MSND解释,实际上如同你自己从地址栏输入 test1.shtml,让浏览器向 Web 服务器发送请求,必然按预期的输出。


Hope helpful!