ASP.NET 如何取得 Request URL 的各个部分

本文介绍如何利用.NET框架中Request对象的多种属性高效解析URL各部分,包括路径、查询字符串等,并对比了传统字串操作方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们在开发页面应用程式,时常需要去解析网址(Request.Url)的每个片段,進行一些判断。例如说 "http://localhost:1897/News/Press/Content.aspx/123?id=1#toc",我们想要取得网址里第一层目录的名字(News)用以判断不同的页面标题(Page Title)。

我看很多人都用字串的 IndexOf 方法与 Substring 方法:

Request.Url.PathAndQuery.Substring(1, Request.Url.PathAndQuery.IndexOf("/", 1)-1)

这实在太埋沒 .NET 的强大设计了,事实上在 Request 物件就已经提供很多方便的属性(Property)可供取得网址的片段。

底下這张表就是各种跟 Browser Request 的网址相关的属性与用法:

网址:http://localhost:1897/News/Press/Content.aspx/123?id=1#toc

Request.ApplicationPath  /

Request.PhysicalPath  D:/Projects/Solution/web/News/Press/Content.aspx

System.IO.Path.GetDirectoryName(Request.PhysicalPath)  D:/Projects/Solution/web/News/Press

Request.PhysicalApplicationPath  D:/Projects/Solution/web/

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

Request.CurrentExecutionFilePath  /News/Press/Content.aspx

Request.FilePath  /News/Press/Content.aspx

Request.Path  /News/Press/Content.aspx/123

Request.RawUrl  /News/Press/Content.aspx/123?id=1

Request.Url.AbsolutePath  /News/Press/Content.aspx/123

Request.Url.AbsoluteUri  http://localhost:1897/News/Press/Content.aspx/123?id=1

Request.Url.Scheme  http

Request.Url.Host  localhost

Request.Url.Port  1897

Request.Url.Authority  localhost:1897

Request.Url.LocalPath  /News/Press/Content.aspx/123

Request.PathInfo  /123

Request.Url.PathAndQuery  /News/Press/Content.aspx/123?id=1

Request.Url.Query  ?id=1

Request.Url.Fragment

Request.Url.Segments  /
                                     News/
                                     Press/
                                     Content.aspx/

                                     123

所以当你看了這张表之后,你还会想用 Request.Url.PathAndQuery.Substring(1, Request.Url.PathAndQuery.IndexOf("/", 1)-1) 这种写法吗?

用这样写 Request.Url.Segments[1].Replace("/", "") 不是又短又直觉吗? ^_^

以下是产生以上表格的程式码:

    protected void Page_Load(object sender, EventArgs e)
    {

        StringBuilder sb = new StringBuilder();

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

        sb.Append("<tr><td colspan=2>");
        sb.Append("網址:"http://localhost:1897/News/Press/Content.aspx/123?id=1#toc">http://localhost:1897/News/Press/Content.aspx/123?id=1#toc        sb.Append("</td></tr>"); ");

        // Request.ApplicationPath
        sb.Append("<tr><td>");
        sb.Append("Request.ApplicationPath");
        sb.Append("</td><td>");
        sb.Append("<b>" + Request.ApplicationPath + "</b>");
        sb.Append("</td></tr>");

        // Request.PhysicalPath
        sb.Append("<tr><td>");
        sb.Append("Request.PhysicalPath");
        sb.Append("</td><td>");
        sb.Append("<b>" + Request.PhysicalPath + "</b>");
        sb.Append("</td></tr>");

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

        // Request.PhysicalApplicationPath
        sb.Append("<tr><td>");
        sb.Append("Request.PhysicalApplicationPath");
        sb.Append("</td><td>");
        sb.Append("<b>" + Request.PhysicalApplicationPath + "</b>");
        sb.Append("</td></tr>");

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

        // Request.CurrentExecutionFilePath
        sb.Append("<tr><td>");
        sb.Append("Request.CurrentExecutionFilePath");
        sb.Append("</td><td>");
        sb.Append("<b>" + Request.CurrentExecutionFilePath + "</b>");
        sb.Append("</td></tr>");

        // Request.FilePath
        sb.Append("<tr><td>");
        sb.Append("Request.FilePath");
        sb.Append("</td><td>");
        sb.Append("<b>" + Request.FilePath + "</b>");
        sb.Append("</td></tr>");

        // Request.Path
        sb.Append("<tr><td>");
        sb.Append("Request.Path");
        sb.Append("</td><td>");
        sb.Append("<b>" + Request.Path + "</b>");
        sb.Append("</td></tr>");

        // Request.RawUrl
        sb.Append("<tr><td>");
        sb.Append("Request.RawUrl");
        sb.Append("</td><td>");
        sb.Append("<b>" + Request.RawUrl + "</b>");
        sb.Append("</td></tr>");

        // Request.Url.AbsolutePath
        sb.Append("<tr><td>");
        sb.Append("Request.Url.AbsolutePath");
        sb.Append("</td><td>");
        sb.Append("<b>" + Request.Url.AbsolutePath + "</b>");
        sb.Append("</td></tr>");

        // Request.Url.AbsoluteUri
        sb.Append("<tr><td>");
        sb.Append("Request.Url.AbsoluteUri");
        sb.Append("</td><td>");
        sb.Append("<b>" + Request.Url.AbsoluteUri + "</b>");
        sb.Append("</td></tr>");

        // Request.Url.Scheme
        sb.Append("<tr><td>");
        sb.Append("Request.Url.Scheme");
        sb.Append("</td><td>");
        sb.Append("<b>" + Request.Url.Scheme + "</b>");
        sb.Append("</td></tr>");

        // Request.Url.Host
        sb.Append("<tr><td>");
        sb.Append("Request.Url.Host");
        sb.Append("</td><td>");
        sb.Append("<b>" + Request.Url.Host + "</b>");
        sb.Append("</td></tr>");

        // Request.Url.Port
        sb.Append("<tr><td>");
        sb.Append("Request.Url.Port");
        sb.Append("</td><td>");
        sb.Append("<b>" + Request.Url.Port + "</b>");
        sb.Append("</td></tr>");

        // Request.Url.Authority
        sb.Append("<tr><td>");
        sb.Append("Request.Url.Authority");
        sb.Append("</td><td>");
        sb.Append("<b>" + Request.Url.Authority + "</b>");
        sb.Append("</td></tr>");

        // local Request.Url.LocalPath
        sb.Append("<tr><td>");
        sb.Append("Request.Url.LocalPath");
        sb.Append("</td><td>");
        sb.Append("<b>" + Request.Url.LocalPath + "</b>");
        sb.Append("</td></tr>");

        // Request.PathInfo
        sb.Append("<tr><td>");
        sb.Append("Request.PathInfo");
        sb.Append("</td><td>");
        sb.Append("<b>" + Request.PathInfo + "</b>");
        sb.Append("</td></tr>");

        // Request.Url.PathAndQuery
        sb.Append("<tr><td>");
        sb.Append("Request.Url.PathAndQuery");
        sb.Append("</td><td>");
        sb.Append("<b>" + Request.Url.PathAndQuery + "</b>");
        sb.Append("</td></tr>");

        // Request.Url.Query
        sb.Append("<tr><td>");
        sb.Append("Request.Url.Query");
        sb.Append("</td><td>");
        sb.Append("<b>" + Request.Url.Query + "</b>");
        sb.Append("</td></tr>");

        // Request.Url.Fragment
        // 原则上你应该无法从 Request.Url.Fragment 取得任何资料,因为通常 Browser 不会送出 #toc 这个部分
        sb.Append("<tr><td>");
        sb.Append("Request.Url.Fragment");
        sb.Append("</td><td>");
        sb.Append("<b>" + Request.Url.Fragment + "</b>");
        sb.Append("</td></tr>");

        // Request.Url.Segments
        sb.Append("<tr>");
        sb.Append("<td>");
        sb.Append("Request.Url.Segments");
        sb.Append("</td>");
        sb.Append("<td>");
        string[] segments = Request.Url.Segments;
        foreach (string s in segments)
        {
            sb.Append("<b>" + s + "</b>");
            sb.Append("<br/>");
        }
        sb.Append("</td>");
        sb.Append("</tr>");

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

        ltlTable.Text = sb.ToString();
    }

注意事項

  • 当程式部署(Deploy)到 IIS 6 之后,假设你的网址是 http://localhost:1897/News/Press/Content.aspx/123 ? ,IIS 不知为何会将问号 ( ? )给刪除掉,以致于 ASP.NET 使用 Request.Url.Query 是空字串!如果你的程式有判断到這部分时就要特別注意,因为照理说应该会抓到才對!不知道是不是 IIS 6 的 Bug ?

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值