ASP.NET 高级编程基础第八篇—Request对象和虚拟路径
前言: 这篇我们开始说一下虚拟路径和Request对象,这些在asp.net中都是非常常用的小知识点,希望我们通过看这篇博客能够更加的加深对这几个知识点的学习,尤其是虚拟路径的”~”的使用还有Request对象的一些属性等。
- 特殊路径标示”~” 虚拟路径
(1) ”/表示网站根目录(域名),../表示上级目录,./表示当前目录”等Http标准定位不一样,~是ASP.NET定义的特殊符号,是ASP.NET内部进行推荐的用法,推荐资源定位都使用~从应用根目录开始定义,应用根目录和网站根目录的区别在于:如果将一个应用程序部署到http://www.cnblogs.com/hanyinglong这个目录下面,应用程序的根目录就是Http://www.cnblogs.com/hanyinglong,网站的根目录是:http://www.cnblogs.com。因此最好用”~”,”~”并不会被浏览器认,因此ASP.NET会将这个路径转换为相对于网站的根目录的全路径在输出到浏览器中。
- 编程处理”~”
(1) 如果在服务端控件中(使用runat=”server”的控件)会自动将”~”进行转换,如果在HTML控件或者需要在代码中转换的话可以使用VirtualPathUtility类中静态方法进行虚拟路径,全路径等的转换,比如:VirtualPathUtility.ToAbsolute(“~/a/b.aspx”)就是将虚拟路径转换为相对应于应用程序根目录的全路径,也就是”WebSite/a/b.aspx”。
(2) VirtualPathUtility类的主要方法
1) string AppendTrailingSlash(string VirtualPath);如果路径VirtualPath最后没有”/”则添加。
2) string Combine(string basePath,string relativePath);将两个路径进行合并。
3) string GetDirectory(string virtualPath); 返回虚拟路径的目录部分。
4) string MakeRelative(string fromPath,string toPath); 计算两个虚拟路径的相对路径。
5) ToAbsolute:转换为绝对路径。
(3) 举例说明:新建一个Web项目,起名为路径.aspx
<a href="/a.htm">a</a>
<a href="~/b.htm">b</a>
<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="/a.htm">ce1</asp:HyperLink>
<asp:HyperLink ID="HyperLink2" runat="server" NavigateUrl="~/b.htm">ce2</asp:HyperLink>
然后拖放两个HyperLink控件,给两个控件的Text起名为Ce1,ce2,给两个控件的NavigateURl赋值为”/b.htm”,”~/b.htm”。在Page_Load事件下面写入如下代码:
Response.Write("<a href='" + VirtualPathUtility.ToAbsolute("~/a/b.htm") + "'>动态</a>" + "<br />");
Response.Write(VirtualPathUtility.Combine(VirtualPathUtility.AppendTrailingSlash("~/a/b"), "c.htm"));
- Request对象
(1) Request.AppRelativeCurrentExecutionFilePath,获取当前执行请求的相对于应用根目录的虚拟路径,以”~”开头,比如:”~/第七篇/index.aspx”。
Response.Write(Request.AppRelativeCurrentExecutionFilePath);
(2) Request.physicalApplicationPath,获取当前应用的物理路径,比如:E:\programmer\黑马程序员练习题\aspnetpractice\ashx\
Response.Write(Request.PhysicalApplicationPath);
(3) Request.PhysicalPath,获取当前请求的物理路径,比如:E:\programmer\黑马程序员练习题\aspnetpractice\ashx\第七篇\index.aspx
Response.Write(Request.PhysicalPath + "<br />");
(4) Request.RawURL,获得原始请求URL,比如:/ashx/第7篇/Index.aspx,Request.URL获得请求的URL,比如:http://localhost:2602/ashx/第7篇/Index.aspx,区别涉及到URL重写的问题。
Response.Write(Request.RawUrl + "<br />");
Response.Write(Request.Url + "<br />");
(5) Request.UrlReferrer网页的来源,可以根据这个判断从百度搜到的哪个关键字,防下载盗链,放图片盗链,可以伪造“本图片仅供博客园内部交流使用”,全局防盗链用Globals.asax。
(6) Request.UserHostAddress获得访问者的IP地址
Response.Write(Request.UserHostAddress + "<br />");
(7) Request.UserLanguage获得访问者浏览器支持的语言,可以通过这个实现对不同语言的人显示不同页面。
Response.Write(Request.UserLanguages + "<br />");
(8) Request.Cookies获取浏览器发过来的浏览器端的Cookie,从他里面读取Cookie值,比如:context.Request.Cookies[“mysessionID”],使用Request.Cookie的时候一般只是读取,将Cookie写回浏览器要用Response.Cookies。
(9) Request.MapPath(virtualPath)将虚拟路径转换为磁盘上的物理路径,request.Mappath(~/第七篇/index.aspx)就会得到:E:\programmer\黑马程序员练习题\aspnetpractice\ashx\第七篇\index.aspx
Response.Write(Request.MapPath("~/第七篇/index.aspx"));
(10) 新建一个文件夹Request对象,然后新建一个一般处理程序,新建一个HTML页面,在HTML页中写入如下代码:
<img src="图片.ashx" />
然后在.ashx页面中写入如下代码:
1 context.Response.ContentType = "image/JPEG"; 2 3 string fullPath = HttpContext.Current.Server.MapPath("1.jpg"); 4 5 using (System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(fullPath)) 6 7 { 8 9 using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap)) 10 11 { 12 13 if (context.Request.UrlReferrer == null) //如果直接浏览则没有URlReferrer 14 15 { 16 17 //g.Clear(System.Drawing.Color.White); 18 19 g.DrawString("禁止直接浏览图片,请在页面中查看", new System.Drawing.Font("宋体", 20), System.Drawing.Brushes.Red, 0, 0); 20 21 } 22 23 else if (context.Request.UrlReferrer.Host != "localhost") 24 25 { 26 27 g.Clear(System.Drawing.Color.White); 28 29 g.DrawString("本图片仅限内部使用", new System.Drawing.Font("宋体", 20), System.Drawing.Brushes.Red, 0, 0); 30 31 } 32 33 g.DrawString("你的IP是:" + context.Request.UserHostAddress, new System.Drawing.Font("宋体", 20), System.Drawing.Brushes.Red, 0, 0); 34 35 if (context.Request.UserHostAddress == "127.0.0.1" || context.Request.UserHostAddress == "192.168.0.1") 36 37 { 38 39 //如果直接访问图片URLReferrer就是null,如果是嵌入到别的网页中的请求,URLReferrer就是页面的地址 40 41 g.Clear(System.Drawing.Color.Blue); 42 43 g.DrawString("IP被屏蔽", new System.Drawing.Font("宋体", 20), System.Drawing.Brushes.Red, 0, 0); 44 45 } 46 47 } 48 49 bitmap.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg); 50 51 }
注释:Request对象和虚拟路径我就说到这里了,下节博客是Response对象和Server对象。
初心商城:初心商城
作者:韩迎龙(Kencery) MVC/.NET群:159227188如果您认为这篇文章还不错或者有所收获,您可以通过右边的“打赏”功能 打赏一杯咖啡,本页版权归作者和博客园所有,欢迎转载,但未经作者同意必须保留此段声明, 且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构