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

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

<div style="width: 900px; margin: auto;">
    <div id="fb-root"></div>
    <fb:comments href="URL HERE" num_posts="10" width="900"></fb:comments>
</div>

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

解决方案

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

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

当前回答

我最喜欢的…

Url.Content(Request.Url.PathAndQuery)

或者只是……

Url.Action()

其他回答

Request.Url.PathAndQuery

应该工作得很好,特别是如果你只想要相对Uri(但保持查询字符串)

浏览器历史记录的大小写(单页样式)

HttpContext.Request.UrlReferrer

您可以使用Request。RawUrl Request.Url。OriginalString, Request.Url.ToString()或Request.Url.AbsoluteUri。

在代码中添加以下扩展方法:

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中有一个bug(可以绕过,见下文)。Net在使用端口而不是端口80的机器上产生(如果内部网站通过虚拟IP上的负载平衡发布,并且端口用于内部发布规则,这是一个大问题)。Net将始终在AbsoluteUri属性上添加端口——即使原始请求没有使用它。

这段代码确保返回的url总是等于浏览器最初请求的url(包括端口——因为它将包含在主机头中),然后才发生任何负载平衡等。

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

如果有任何奇怪的代理之间重写主机头,那么这也不会工作。

2013年7月30日更新

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

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

2012年7月9日更新

不久前我偶然发现了这个问题,并打算更新这个答案,但一直没有。当这个答案得到好评时,我想我应该现在就做。

我在Asp中提到的“bug”。Net可以用一个明显没有记录的appSettings值来控制-称为'aspnet:UseHostHeaderForRequest' -即:

<appSettings>
  <add key="aspnet:UseHostHeaderForRequest" value="true" />
</appSettings>

我在查看HttpRequest时遇到了这个。ILSpy中的Url -由ILSpy视图中下面的复制/粘贴左侧的——>指示:

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”设置

我也在寻找这个Facebook的原因,到目前为止,没有一个答案是必要的,或者太复杂了。

@Request.Url.GetLeftPart(UriPartial.Path)

获取“不包含”查询字符串的完整协议、主机和路径。如果您使用的不是默认的80,也包括端口。