代码改变世界

转:ASP.NET中的路径(path) 详解

2013-06-06 20:23  youxin  阅读(419)  评论(0编辑  收藏  举报

 一 ASP.NET常用路径(path)获取方法与格式对照表

  假设我们的网址为http://localhost:1897/ News/Press/Content.aspx?id=1019

 Browser Request 的网址相关的属性与方法

输出(output)实例

备        

Request.ApplicationPath 

指的是当前的application(应用程序)的目录

Request.PhysicalPath 

D:\Projects\Solution\web\News\Press\Content.aspx

磁盘驱动器代号:\父目录\子目录\Content.aspx

Request.PhysicalApplicationPath 

D:\Projects\Solution\web\

磁盘驱动器代号:\父目录\子目录\ 

Request.CurrentExecutionFilePath 

/News/Press/Content.aspx

 

Request.FilePath

/News/Press/Content.aspx

对应于iis的虚拟目录。

Request.Path 

/News/Press/Content.aspx

当前请求的虚拟路径。Path 是 FilePath 和 PathInfo 尾部的串联。*(见下面详细讲解)

Server.MapPath(string url)

例http://www.example.com/1/index.html, 假设你的应用程序在c:/iis/MySite中,那么就是c:/iis/MySite/1/index.html

将url映射为服务器上的物理路径 
 

Request.RawUrl 

/News/Press/Content.aspx?id=1019

 

Request.Url.AbsolutePath 

/News/Press /Content.aspx 

 

Request.Url.AbsoluteUri 

http://localhost:1897/Content.aspx?id=1019

 

Request.Url.LocalPath 

/News/Press//Content.aspx 

 

Request.Url.PathAndQuery 

/News/Press//Content.aspx?id=1019&uu=77 

 

Request.Url.Scheme 

http

 

Request.Url.Host 

localhost 

 

Request.Url.Port 

1987

 

Request.Url.Authority 

localhost:1897 

 

Request.Url.Query 

?id=1019 

 

Request.Url.Query[id] 

1019 

 

Request.Url.Fragments

/
News/
Press/
Content.aspx

 

Request.Url.Segments[0] 

 

System.IO.Path.GetDirectoryName(Request.PhysicalPath) 

D:\Projects\Solution\web\News\Press 

磁盘驱动器代号:\父目录\子目录\ 

 

System.IO.Path.GetFileName(Request.PhysicalPath)

Content.aspx 

 

 

(接上面*) Request.FilePath, Request.PathInfo, Request.Path, RequestRawUrl

 

  如果请求的地址为http://www.cnblogs.com/default.aspx/books则

Request.FilePath值为http://www.cnblogs.com/default.aspx

Request.PathInfo 值为 /books

Request.Path 值为 http://www.cnblogs.com/default.aspx/books

Request.RawUrl 值为 http://www.cnblogs.com/default.aspx/books

  如果请求地址为http://www.cnblogs.com/defaut.aspx?id=1&name=kk则

Request.FilePath值为http://www.cnblogs.com/default.aspx

Request.PathInfo 值为 ""(空字符串)

Request.Path 值为 http://www.cnblogs.com/default.aspx

Request.RawUrl 值为 http://www.cnblogs.com/default.aspx?id=1&name=kk

 

 

  二 Request.ServerVariables集合中获取到的相关信息:

 
  左列是服务器变量名,右侧是值,值是通过Request.ServerVariables[服务器变量名]获取的
APPL_MD_PATH : /LM/W3SVC/894523/Root
APPL_PHYSICAL_PATH : D:\VssWorkFolder\British_School_MIS\src\WebSite\
INSTANCE_META_PATH : /LM/W3SVC/894523
LOCAL_ADDR : 192.168.1.6
PATH_INFO : /SysOption/BillingSetup1.aspx
PATH_TRANSLATED : D:\VssWorkFolder\British_School_MIS\src\WebSite\SysOption\BillingSetup1.aspx
REMOTE_ADDR : 192.168.1.6
REMOTE_HOST : 192.168.1.6
SCRIPT_NAME : /SysOption/BillingSetup1.aspx
SERVER_NAME : 192.168.1.6
URL : /SysOption/BillingSetup1.aspx

  Request.ServerVariables是一个很强大的工具,可以帮助我们获取很多client和web宿主的信息,有兴趣的朋友可以通过以下代码看看它到底包含什么信息

        foreach (string s in Request.ServerVariables)
        {
            Response.Write(s + "  :  " + Request.ServerVariables[s] + "<br /><br />");
        }


  三 path转换

 
  1.转换为服务器端路径(Server.MapPath)
web服务器端开发设计一个有趣的问题就是,地址转换。比如http地址/images/a.txt,如果你想在服务器端通过io读取这个文件,就得有这个文件的“本机地址(形如c:\windows\system32\xx.dll)”,这时Server.MapPath就很有用了
Response.Write(Request.MapPath(Request.Path));        输出为 D:\VssWorkFolder\British_School_MIS\src\WebSite\SysOption\BillingSetup1.aspx
2.转换为http地址(Page.ResolveClientUrl Page.ResolveUrl)
Response.Write(Page.ResolveClientUrl("~/a/a.jpg"));      输出为 ../a/a.jpg 
Response.Write(Page.ResolveUrl("~/a/a.jpg"));              输出为 /a/a.jpg 

 

  另外,我们使用upload控件上传文件时,用HttpPostedFile 。例如:

HttpPostedFile file = context.Request.Files[i];//这里的context.Request.Files就是上传的文件集合.

PS:此处乃是利用HttpHandler..在Page页面中可以自己用其它办法多文件上传.

  接着如何保存文件呢?

利用HttpPostedFile的SaveAs方法即可,如: file.SaveAs(SpecifiedPath);

此处的SpecifiedPath是上传文件的绝对路径.

  至于如何获取上传文件的路径.我们可以利用Path类.来操作File.HttpPostedFile类中也包含了文件的基本信息.如文件名,大小,路径等等.Path类操作更齐全而已.接着就可以利用Server.MapPath()方法来进行转换.

 

  为检验上面的理论,你可以编写一段code跑下就一清二楚啦。例:

StringBuilder req = new StringBuilder(); 

req.Append("<table cellpadding=3 cellspacing=0 border=1>"); 

 

// Request.ApplicationPath 

req.Append("<tr><td>"); 

req.Append("Request.ApplicationPath"); 

req.Append("</td><td>"); 

req.Append("<b>" + Request.ApplicationPath + "</b>"); 

req.Append("</td></tr>"); 

 

// Request.PhysicalPath 

req.Append("<tr><td>"); 

req.Append("Request.PhysicalPath"); 

req.Append("</td><td>"); 

req.Append("<b>" + Request.PhysicalPath + "</b>"); 

req.Append("</td></tr>"); 

 

// System.IO.Path.GetDirectoryName(Request.PhysicalPath) 

req.Append("<tr><td>"); 

req.Append("System.IO.Path.GetDirectoryName(Request.PhysicalPath)"); 

req.Append("</td><td>"); 

req.Append("<b>" + System.IO.Path.GetDirectoryName(Request.PhysicalPath) + "</b>"); 

req.Append("</td></tr>"); 

 

// Request.PhysicalApplicationPath 

req.Append("<tr><td>"); 

req.Append("Request.PhysicalApplicationPath"); 

req.Append("</td><td>"); 

req.Append("<b>" + Request.PhysicalApplicationPath + "</b>"); 

req.Append("</td></tr>"); 

 

// System.IO.Path.GetFileName(Request.PhysicalPath) 

req.Append("<tr><td>"); 

req.Append("System.IO.Path.GetFileName(Request.PhysicalPath)"); 

req.Append("</td><td>"); 

req.Append("<b>" + System.IO.Path.GetFileName(Request.PhysicalPath) + "</b>"); 

req.Append("</td></tr>"); 

 

// Request.CurrentExecutionFilePath 

req.Append("<tr><td>"); 

req.Append("Request.CurrentExecutionFilePath"); 

req.Append("</td><td>"); 

req.Append("<b>" + Request.CurrentExecutionFilePath + "</b>"); 

req.Append("</td></tr>"); 

 

// Request.FilePath 

req.Append("<tr><td>"); 

req.Append("Request.FilePath"); 

req.Append("</td><td>"); 

req.Append("<b>" + Request.FilePath + "</b>"); 

req.Append("</td></tr>"); 

 

// Request.Path 

req.Append("<tr><td>"); 

req.Append("Request.Path"); 

req.Append("</td><td>"); 

req.Append("<b>" + Request.Path + "</b>"); 

req.Append("</td></tr>"); 

 

// Request.RawUrl 

req.Append("<tr><td>"); 

req.Append("Request.RawUrl"); 

req.Append("</td><td>"); 

req.Append("<b>" + Request.RawUrl + "</b>"); 

req.Append("</td></tr>"); 

 

// Request.Url.AbsolutePath 

req.Append("<tr><td>"); 

req.Append("Request.Url.AbsolutePath"); 

req.Append("</td><td>"); 

req.Append("<b>" + Request.Url.AbsolutePath + "</b>"); 

req.Append("</td></tr>"); 

 

// Request.Url.AbsoluteUri 

req.Append("<tr><td>"); 

req.Append("Request.Url.AbsoluteUri"); 

req.Append("</td><td>"); 

req.Append("<b>" + Request.Url.AbsoluteUri + "</b>"); 

req.Append("</td></tr>"); 

 

// Request.Url.Scheme 

req.Append("<tr><td>"); 

req.Append("Request.Url.Scheme"); 

req.Append("</td><td>"); 

req.Append("<b>" + Request.Url.Scheme + "</b>"); 

req.Append("</td></tr>"); 

 

// Request.Url.Host 

req.Append("<tr><td>"); 

req.Append("Request.Url.Host"); 

req.Append("</td><td>"); 

req.Append("<b>" + Request.Url.Host + "</b>"); 

req.Append("</td></tr>"); 

 

// Request.Url.Port 

req.Append("<tr><td>"); 

req.Append("Request.Url.Port"); 

req.Append("</td><td>"); 

req.Append("<b>" + Request.Url.Port + "</b>"); 

req.Append("</td></tr>"); 

 

// Request.Url.Authority 

req.Append("<tr><td>"); 

req.Append("Request.Url.Authority"); 

req.Append("</td><td>"); 

req.Append("<b>" + Request.Url.Authority + "</b>"); 

req.Append("</td></tr>"); 

 

// local Request.Url.LocalPath 

req.Append("<tr><td>"); 

req.Append("Request.Url.LocalPath"); 

req.Append("</td><td>"); 

req.Append("<b>" + Request.Url.LocalPath + "</b>"); 

req.Append("</td></tr>"); 

 

// Request.PathInfo 

req.Append("<tr><td>"); 

req.Append("Request.PathInfo"); 

req.Append("</td><td>"); 

req.Append("<b>" + Request.PathInfo + "</b>"); 

req.Append("</td></tr>"); 

 

// Request.Url.PathAndQuery 

req.Append("<tr><td>"); 

req.Append("Request.Url.PathAndQuery"); 

req.Append("</td><td>"); 

req.Append("<b>" + Request.Url.PathAndQuery + "</b>"); 

req.Append("</td></tr>"); 

 

// Request.Url.Query 

req.Append("<tr><td>"); 

req.Append("Request.Url.Query"); 

req.Append("</td><td>"); 

req.Append("<b>" + Request.Url.Query + "</b>"); 

req.Append("</td></tr>"); 

 

// Request.Url.Fragment 

// 原则上你应该无法从 Request.Url.Fragment 取得任何数据,因为通常 Browser 不会送出 #toc 这个部分 

req.Append("<tr><td>"); 

req.Append("Request.Url.Fragment"); 

req.Append("</td><td>"); 

req.Append("<b>" + Request.Url.Fragment + "</b>"); 

req.Append("</td></tr>"); 

 

// Request.Url.Segments 

req.Append("<tr>"); 

req.Append("<td>"); 

req.Append("Request.Url.Segments"); 

req.Append("</td>"); 

req.Append("<td>"); 

string[] segments = Request.Url.Segments; 

foreach (string s in segments) 

    req.Append("<b>" + s + "</b>"); 

    req.Append("<p>"); 

req.Append("</td>"); 

req.Append("</tr>"); 

req.Append("</table>"); 

Response.Write(req.ToString()); 

 参考的文章:
http://blog.miniasp.com/post/2008/02/10/How-Do-I-Get-Paths-and-URL-fragments-from-the-HttpRequest-object.aspx

http://www.cnblogs.com/zyip/archive/2009/08/13/1544968.html

如有错误,请不吝指出。

 

另加上一个实例:

// Builds an absolute URL
  private static string BuildAbsolute(string relativeUri)
  {
    // get current uri
    Uri uri = HttpContext.Current.Request.Url;
    // build absolute path
    string app = HttpContext.Current.Request.ApplicationPath;
    if (!app.EndsWith("/")) app += "/";
    relativeUri = relativeUri.TrimStart('/');
    // return the absolute path
    return HttpUtility.UrlPathEncode(
      String.Format("http://{0}:{1}{2}{3}",
      uri.Host, uri.Port, app, relativeUri));
  }