我正在使用我正在建设的博客上的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>

当前回答

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

其他回答

public static string GetCurrentWebsiteRoot()
{
    return HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority);
}
Request.Url.PathAndQuery

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

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

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

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

Request.Url.AbsoluteUri.ToString ()

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

.ToLower Request.Url.AbsoluteUri.ToString () ()

然后对于我的要求(检查网站正在访问的域名并显示相关内容):

.ToLower Request.Url.AbsoluteUri.ToString () () .Contains(“xxxx”)

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

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