【问题标题】:How do I get the full url of the page I am on in C#如何在 C# 中获取我所在页面的完整 url
【发布时间】:2010-09-07 15:04:36
【问题描述】:

我需要能够从用户控件获取我所在页面的完整 URL。只是将一堆请求变量连接在一起的问题吗?如果有,有哪些?还是有更简单的方法?

【问题讨论】:

标签: c# asp.net user-controls


【解决方案1】:

这是我通常参考的此类信息的列表:

Request.ApplicationPath :   /virtual_dir
Request.CurrentExecutionFilePath :  /virtual_dir/webapp/page.aspx
Request.FilePath :  /virtual_dir/webapp/page.aspx
Request.Path :  /virtual_dir/webapp/page.aspx
Request.PhysicalApplicationPath :   d:\Inetpub\wwwroot\virtual_dir\
Request.QueryString :   /virtual_dir/webapp/page.aspx?q=qvalue
Request.Url.AbsolutePath :  /virtual_dir/webapp/page.aspx
Request.Url.AbsoluteUri :   http://localhost:2000/virtual_dir/webapp/page.aspx?q=qvalue
Request.Url.Host :  localhost
Request.Url.Authority : localhost:80
Request.Url.LocalPath : /virtual_dir/webapp/page.aspx
Request.Url.PathAndQuery :  /virtual_dir/webapp/page.aspx?q=qvalue
Request.Url.Port :  80
Request.Url.Query : ?q=qvalue
Request.Url.Scheme :    http
Request.Url.Segments :  /
    virtual_dir/
    webapp/
    page.aspx

希望你会发现这很有用!

【讨论】:

  • 1) 还有Request.RawUrl; 2) Request.Url 可能会在“非常糟糕的请求路径”上引发异常。
  • 非常有帮助的答案,但端口号是否应该保持一致以避免混淆(假设所有示例都针对相同的请求?例如,Authority 和 Port 暗示端口 80,但 AbsoluteUri 包含端口 2000)
  • Request.QueryString 仅返回 q=qvalue
  • 工作正常:)
【解决方案2】:

我通常使用Request.Url.ToString() 来获取完整的url(包括查询字符串),不需要连接。

【讨论】:

  • 如果 URL 包含 '#' 则 # 之后的所有字符都将不包括在内。
  • @KrunalSisodiya 我不认为 URL 的哈希值会发送到服务器,但我可能是错的。
  • Request.Url.ToString() 不包括 queryString。
【解决方案3】:
Request.Url.AbsoluteUri

此属性可满足您的所有需求,只需一个简洁的调用即可。

【讨论】:

  • +1。这是最好的答案。应该优先于 Request.Url.ToString()。
【解决方案4】:

对于ASP.NET Core,您需要将其拼写出来:

var request = Context.Request;
@($"{ request.Scheme }://{ request.Host }{ request.Path }{ request.QueryString }")

或者您可以在视图中添加 using 语句:

@using Microsoft.AspNetCore.Http.Extensions

然后

@Context.Request.GetDisplayUrl()

_ViewImports.cshtml 可能更适合@using

【讨论】:

  • 谢谢。这有帮助!
  • 应该是$"{ request.Scheme }{ Uri.SchemeDelimiter }{ request.Host }{ request.PathBase.Add(request.Path) }{ request.QueryString }"
  • 可能吗?您应该在发表评论之前测试这些假设。我测试了我的...
【解决方案5】:

如果您需要完整的 URL 作为从 http 到查询字符串的所有内容,则需要连接以下变量

Request.ServerVariables("HTTPS") // to check if it's HTTP or HTTPS
Request.ServerVariables("SERVER_NAME") 
Request.ServerVariables("SCRIPT_NAME") 
Request.ServerVariables("QUERY_STRING")

【讨论】:

  • 这里不考虑非标准端口(即不使用端口80进行http)
  • 您可以使用 Request.ServerVariables("SERVER_PORT") 进行端口检测!
  • 请注意,此答案使用 VB.Net 语法。在 C# 中,例如使用 Request.ServerVariables["HTTPS"]。
【解决方案6】:

Request.RawUrl

【讨论】:

【解决方案7】:

使用Request.Url.OriginalString 比使用Request.Url.ToString() 更好(根据MSDN

【讨论】:

  • 如果你真的需要原始字符串,那就更好了。
  • @DirkThe from 上面的 MSDN 链接:“ToString 方法返回的字符串可能包含控制字符,这会破坏控制台应用程序的状态。您可以使用带有 UriFormat.SafeUnescaped 格式的 GetComponents 方法从返回的字符串中删除控制字符。”
  • 没错,和OriginalString无关。
【解决方案8】:

谢谢大家,我结合了@Christian 和@Jonathan 的回答来满足我的特定需求。

"http://" + Request.ServerVariables["SERVER_NAME"] +  Request.RawUrl.ToString()

我不需要担心安全 http,需要 servername 变量,RawUrl 处理来自域名的路径并包含查询字符串(如果存在)。

【讨论】:

  • 您还应该知道,与 Request.Url 不同的是,如果使用 url 映射,RawUrl 表示原始的、未映射的请求 url。
  • SERVER_NAME 通常不会返回客户端使用的“真实”URL。如果要直接挖掘,HTTP_HOST 可能是更好的形式.. 也错过了简单的 HTTP-to-another-port。
【解决方案9】:

如果你还需要端口号,你可以使用

Request.Url.Authority

例子:

string url = Request.Url.Authority + HttpContext.Current.Request.RawUrl.ToString();

if (Request.ServerVariables["HTTPS"] == "on")
{
    url = "https://" + url;
}
else 
{
    url = "http://" + url;
}

【讨论】:

    【解决方案10】:

    试试下面的 -

    var FullUrl = Request.Url.AbsolutePath.ToString();
    var ID = FullUrl.Split('/').Last();
    

    【讨论】:

      猜你喜欢
      • 2018-10-01
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 2022-06-28
      • 1970-01-01
      • 2019-09-24
      • 1970-01-01
      • 2014-10-14
      相关资源
      最近更新 更多