目录:
1.虚拟路径
1.1.特殊路径标识“~” (~只能在服务器控件使用)
1.2. 举例,用~,而不是/的好处。WebSite。
1.3.编程处理“~”
2.Request对象
ASP.NET中Server.MapPath() 和 Request.MapPath()使用区别
3.Response对象
4.Server对象
示例:Server.Transfer(path)
1.虚拟路径
1.1.特殊路径标识“~” (~只能在服务器控件使用)
和“/表示网站根目录(域名)、../表示上级目录、./表示当前目录”等Http标准定位不一样,~是ASP.Net定义的特殊符号,是ASP.Net内部进行定义推荐的用法,推荐资源定位都使用~从应用根目录开始定义。应用根目录和网站根目录的区别在于:如果将一个应用部署到http://www.rupeng.com/search这个目录下,应用的根目录是“http://www.rupeng.com/search”,网站的根目录是“http://www.rupeng.com/”(创建WebSite进行演示,因为不同的WebSite都是在同一个网站根目录下的),因此最好用“~”,“~”并不会被浏览器认,因此ASP.Net会将这个路径转换为相对于网站的根目录的全路径再输出到浏览器。
<a href="/a.aspx">/路径</a>
<a href="../a.aspx">../路径</a>
<a href="./a.aspx">./路径</a>
|
1.2. 举例,用~,而不是/的好处。WebSite。
1.假如在这个位置用
http://localhost:4217/虚拟地址/虚拟路径/Default.aspx
<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="http://www.cnblogs.com/Cookie1.aspx">HyperLink</asp:HyperLink>
2.移动到这个位置
http://localhost:4217/虚拟地址/Default.aspx
3.就不能找到这个地址
如果使用~,就很好的解决这个问题了。
<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="~/Cookie1.aspx">HyperLink</asp:HyperLink>
1.3.编程处理“~”
- 如果在服务端控件中(使用runat=server的控件)会自动将“~”进行转换,如果在HTML控件或者需要在代码中转换的话可以使用VirtualPathUtility类中静态方法进行虚拟路径、全路径等的转换,比如VirtualPathUtility.ToAbsolute("~/a/b1.aspx")就是将虚拟路径转换为相对于应用根的全路径,也就是/WebSite4/a/b1.aspx
- (*)VirtualPathUtility类主要方法:string AppendTrailingSlash(string virtualPath):如果路径virtualPath最后没有“/”则添加;string Combine(string basePath, string relativePath),将两个路径进行合并;string GetDirectory(string virtualPath),返回虚拟路径的目录部分;string MakeRelative(string fromPath, string toPath),计算两个虚拟路径的相对路径;ToAbsolute,转换为绝对路径
2.Request对象
- 1、 (*) Request.AppRelativeCurrentExecutionFilePath,获取当前执行请求相对于应用根目录的虚拟路径,以~开头,比如“~/Handler.ashx”,
Response.Write("获取当前执行请求相对于应用根目录的虚拟路径AppRelativeCurrentExecutionFilePath:"
+ Request.AppRelativeCurrentExecutionFilePath);
- 2、 (*) Request.PhysicalApplicationPath,获取当前应用的物理路径,比如D:\我的文档\Visual Studio 2008\WebSites\WebSite4\
- 3、 (*) Request.PhysicalPath,获取当前请求的物理路径,比如D:\我的文档\Visual Studio 2008\WebSites\WebSite4\Handler.ashx
- 4、 (*) Request.RawUrl 获得原始请求URL、Request.Url获得请求的URL,区别涉及到URL重写的问题
- 5、Request.UrlReferrer 网页的来源,可以根据这个判断从百度搜的哪个关键词、防下载盗链、防图片盗链,可以伪造(比如迅雷)。"本图片仅供如鹏网内部交流使用",在DZ中测试。全局防盗链用Globals.asax
- 6、Request.UserHostAddress 获得访问者的IP地址
- 7、 (*) Request.UserLanguages 获得访问者浏览器支持的语言,可以通过这个实现对不同语言的人显示不同语言的页面。
- 8、Request.Cookies 获取浏览器发过来的浏览器端的Cookie,从它里面读取Cookie值,比如context.Request.Cookies["mysessionid"],使用Request.Cookies 的时候一般只是读取,将Cookie写回浏览器要用Response.Cookies
- 9、Request.MapPath(virtulPath) 将虚拟路径转换为磁盘上的物理路径,(相当于Server.Mappath())
Request.MapPath("~/a/b.aspx")就会得到D:\2008\WebSites\WebSite4\a\b.aspx
ASP.NET中Server.MapPath() 和 Request.MapPath()使用区别
Server.MapPath(string):是将相对于当前调用文件的文件(或目录)映射为物理路径;
Request.MapPath(string):是将string虚拟路径映射为物理路径(asp中Request无此方法)
Server.MapPath(string)中string可以用“../”方式引用父目录,甚至可以将此目录跳到整个WEB目录外,如:C:\WWWROOT
目录为WEB根目录,在根目录文件中调用此Server.MapPath("../xyz.gif"),则可以调用WEB目录外的脚本、资源等。
Request.MapPath(string)中的string为虚拟目录,只能相对WEB虚拟目录形式的,也不允许"../"方式调用,只能是"/","/xx"等字符串
有时候直接用Server.MapPath(string)调用一个文件比较麻烦,因为不同的目录中调用同一个Server.MapPath(string)函数就会得到不同的值,特殊的话,就需要通过判断本身目录层次才能获取正确的地址,使用的Request.MapPath(string)就可以调用同一个目录文件。不用做目录判断
3.Response对象
-
响应的缓冲输出:为了提高服务器的性能,ASP.Net向浏览器Write的时候默认并不会每Write一次都会立即输出到浏览器,而是会缓存数据,到合适的时机或者响应结束才会将缓冲区中的数据一起发送到浏览器。
- Response对象的主要成员:
- 1、Response.Buffer、Response.BufferOutput:经过Reflector反编译,发现两个属性是一样的,Buffer内部就是调用的BufferOutput。这个属性用来控制是否采用响应缓存,默认是true。
- 2、Response.Flush() 将缓冲区中的数据发送给浏览器。这在需要将Write出来的内容立即输出到浏览器的场合非常适用。案例:大批量数据的导入,显示正在导入第*条数据,用Thread.Sleep模拟耗时。
- 3、Response.Clear() 清空缓存区中的数据,这样在缓存区中的没有发送到浏览器端的数据被清空,不会被发送到浏览器。在用aspx输出非html的例子中经常看到用clear来输出httpmodule等给附加的内容(不推荐,推荐用ashx)
- 4、Response.ContentEncoding 输出流的编码。
- 5、Response.ContentType 输出流的内容类型,比如是html(text/html)还是普通文本(text/plain)还是JPEG图片(image/JPEG)。
- 6、Response.Cookies 返回给浏览器的Cookie的集合,可以通过它设置Cookie
- 7、Response.OutputStream 输出流,在输出图片、Excel文件等非文本内容的时候要使用它
- 8、Response.End() 终止响应,将之前缓存中的数据发给浏览器,End()之后的代码不会被继续执行。在终止一些非法请求的时候,比如盗链等可以用End()立即终止请求。
- 9、Response.Redirect(url) 重定向浏览器到新的网址。即可以重定向到站外网址也可以重定向到站内网址。Response.Redirect("http://www.rupeng.com")、Response.Redirect("a.htm")。Redirect是向浏览器发回302重定向,是通知浏览器“请重新访问url这个网址”,这个过程经历了服务器通知浏览器“请重新访问url这个网址”和浏览器接到命令访问新网址的过程。使用HttpWatch查看整个响应过程的Http报文。用Redirect因为是浏览器自己去重新访问新网址的,所以在地址栏中是可以看到网址的变化的。后面会用来防止刷新浏览器时提示“重试”。
- 10、Response.SetCookie(HttpCookie cookie),向输出流中更新写到浏览器中的Cookie,如果Cookie存在就更新不存在就增加。是对Response.Cookies的简化调用。
- 11、Response.Write() 向浏览器输出内容。
- 12、(*)Response.WriteFile(filename) 向浏览器输出文件。比如Response.WriteFile("c:/boot.ini")
4.Server对象
- Server是context的一个属性,是HttpServerUtility类的一个对象
-
Server.HtmlDecode()、Server.HtmlEncode() Server.UrlEncode()、 Server.UrlDecode()是对HttpUtility类中相应方法的一个代理调用。个人推荐总是使用HttpUtility,因为有的地方很难拿到Server对象。别把HtmlEncode、UrlEncode混了,UrlEncode是处理超链接的, HtmlEncode是处理html代码的。
-
Server.Transfer(path) 内部重定向请求,Server.Transfer("JieBanRen.aspx")将用户的请求重定向给JieBanRen.aspx处理,是服务器内部的接管,浏览器是意识不到这个接管的,不是象Response.Redirect那样经历“通知浏览器‘请重新访问url这个网址’和浏览器接到命令访问新网址的过程”,是一次http请求,因此浏览器地址栏不会变化(联想,呼叫中心坐席告诉客户一个号码和帮客户转接的区别)。因为是内部接管,所以在被重定向到的页面中是可以访问到Request、Cookies等这些来源页面接受的参数的,就像这些参数是传递给他的,而Redirect则不行,因为是让浏览器去访问的。注意Transfer是内部接管,因此不能像Redirect那样重定向到外部网站。 (常考)
示例:
Tansfer.aspx
protected void Page_Load(object sender, EventArgs e)
{
string q = Request["q"];
if (q == "1")
{
Server.Transfer("http://www.baidu.com");
}
else if(q =="2")
{
Response.Redirect("http://www.baidu.com");
}
}
接收.aspx
protected void Page_Load(object sender, EventArgs e)
{
Response.Write( Request["q"]);
}
- 使用Server.Transfer不能直接重定向到ashx,否则会报错“执行子请求出错”。
- 有的时候不能拿到HttpContext对象,比如在Global.asax中(后面讲),可以通过HttpContext.Current拿到当前的HttpContext,进而拿到Response、Request、Server等。
- Server.MapPath。如果拿不到Server则使用HostingEnvironment.MapPath()方法
|
请发表评论