关于c#:如何在MVC 3中获取当前页面URL

How to get current page URL in MVC 3

我正在建立一个博客上使用Facebook评论插件。它有一些fbxml标记,由页面上引用的facebook javascript解释。

这一切都很好,但我必须将当前完全合格的URL传递给插件。

1
    <fb:comments href="URL HERE" num_posts="10" width="900"></fb:comments>

获取当前页面的URL的最佳方法是什么?请求URL。

解决方案

下面是我的解决方案的最终代码:

1
<fb:comments href="@Request.Url.AbsoluteUri" num_posts="15" width="900"></fb:comments>

您可以使用Request.RawUrlRequest.Url.OriginalStringRequest.Url.ToString()Request.Url.AbsoluteUri


将此扩展方法添加到代码中:

1
2
3
4
5
6
7
8
9
public static Uri UrlOriginal(this HttpRequestBase request)
{
  string hostHeader = request.Headers["host"];

  return new Uri(string.Format("{0}://{1}{2}",
     request.Url.Scheme,
     hostHeader,
     request.RawUrl));
}

然后你可以从RequestContext.HttpContext.Request属性中执行它。

ASP.NET中存在一个错误(可以是侧移的,请参阅下面),该错误出现在使用端口80以外的本地网站端口的计算机上(如果内部网站是通过虚拟IP上的负载平衡发布的,并且端口在内部用于发布规则,则是一个大问题),因此ASP.NET将始终在AbsoluteUri属性-eve上添加端口。n如果原始请求不使用它。

此代码确保在进行任何负载平衡等操作之前,返回的URL始终等于浏览器最初请求的URL(包括端口,因为它将包含在主机头中)。

至少,它在我们的(相当复杂!)环境:)

如果在重写主机头的过程中有任何奇怪的代理,那么这也不会起作用。

2013年7月30日更新

正如@kevinjones在下面的评论中提到的-我在下一节中提到的设置已经记录在这里:http://msdn.microsoft.com/en-us/library/hh975440.aspx

虽然我不得不说,当我尝试的时候,我不能让它工作-但那可能只是我做了一个打字错误或什么。

2012年7月9日更新

不久前我遇到了这个问题,我想更新这个答案,但从来没有。当一个赞成票刚刚进入这个答案时,我想我应该现在就做。

我在ASP.NET中提到的"bug"可以通过一个明显未记录的appsettings值(称为'aspnet:UseHostHeaderForRequest')来控制,即:

1
</appSettings>

我是在看iLSpy中的HttpRequest.Url时发现的,这是由iLSpy视图中以下副本/粘贴左侧的--->指示的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public Uri Url
{
  get
  {
    if (this._url == null && this._wr != null)
    {
      string text = this.QueryStringText;
      if (!string.IsNullOrEmpty(text))
      {
        text ="?" + HttpEncoder.CollapsePercentUFromStringInternal(text,
          this.QueryStringEncoding);
      }
 ---> if (AppSettings.UseHostHeaderForRequestUrl)
      {
        string knownRequestHeader = this._wr.GetKnownRequestHeader(28);
        try
        {
          if (!string.IsNullOrEmpty(knownRequestHeader))
          {
            this._url = new Uri(string.Concat(new string[]
            {
              this._wr.GetProtocol(),
             "://",
              knownRequestHeader,
              this.Path,
              text
            }));
          }
        }
        catch (UriFormatException)
        { }
     }
     if (this._url == null) { /* build from server name and port */
       ...

我个人还没有使用过它——它是没有文件的,因此不能保证会一直使用——但是它可能会做和我上面提到的一样的事情。为了提高搜索结果的相关性,并确认其他人发现了这一点,nick aceves在twitter上也提到了'aspnet:UseHostHeaderForRequest'设置。


1
2
3
4
public static string GetCurrentWebsiteRoot()
{
    return HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority);
}


1
Request.Url.PathAndQuery

应该可以很好地工作,特别是如果您只需要相对的URI(但保留querystrings)


我也是出于facebook的原因来寻找这个问题的,目前给出的答案都没有根据需要有效,也没有太复杂的。

1
@Request.Url.GetLeftPart(UriPartial.Path)

获取完整的协议、主机和路径"without"querystring。如果您使用的不是默认80,还包括端口。


我最喜欢的…

1
Url.Content(Request.Url.PathAndQuery)

或者只是…

1
Url.Action()


对我来说,问题是当我试图访问控制器的构造函数中的HTTPContext,而HTTPContext还没有准备好。当移入索引方法时,它起作用:

1
2
var uri = new Uri(Request.Url.AbsoluteUri);
url = uri.Scheme +"://" + uri.Host +"/";enter code here


其他答案中没有提到的一件事是区分大小写,如果要在多个地方引用它(它不在原始问题中,但值得考虑,因为这个问题出现在许多类似的搜索中)。根据其他答案,我发现以下内容最初对我有用:

埃多克斯1〔10〕

但为了更加可靠,这就变成了:

江户十一〔11〕。

然后根据我的要求(检查从哪个域名访问该网站并显示相关内容):

埃多克斯1〔12〕