web-dev-qa-db-ja.com

MVC 3で現在のページのURLを取得する方法

私が構築しているブログでFacebookのコメントプラグインを使用しています。それはページで参照されているFacebookのJavaScriptによって解釈されるいくつかのFBXMLタグを持っています。

これはすべてうまくいきますが、現在の完全修飾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>
338
Chev

Request.RawUrlRequest.Url.OriginalStringRequest.Url.ToString()、またはRequest.Url.AbsoluteUriを使用できます。

506
Darin Dimitrov

この拡張メソッドをコードに追加します。

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プロパティから実行できます。

ローカルWebサイトにポート80以外のポートを使用するマシンで発生するAsp.Netにはバグがあります(以下を参照)(内部IPサイトが仮想IPのロードバランシングを介して公開されている場合は大きな問題です)およびポートは公開ルールのために内部的に使用されます)。これにより、Asp.Netはalways元のリクエストが使用しない場合でもAbsoluteUriプロパティにポートを追加します。

このコードは、ロードバランシングなどが行われる前に、返されたURLがブラウザー元々要求されたURL(ホストヘッダーに含まれるポートを含む)と常に等しいことを保証します。

少なくとも、(やや複雑な!)環境では:)

その間にHostヘッダーを書き換えるファンキーなプロキシがある場合、これも機能しません。

2013年7月30日更新

以下のコメントで@KevinJonesが言及したように、次のセクションで言及する設定はここに文書化されています。 http://msdn.Microsoft.com/en-us/library/hh975440.aspx

私はそれを試してみたらうまくいかなかったと言わざるを得ませんが、それはタイプミスか何かを作っているだけかもしれません。

2012年7月9日更新

私は少し前にこれに出くわし、この答えを更新するつもりでしたが、決してしませんでした。この答えに賛成票がちょうど入ったとき、私は今やるべきだと思った。

私がAsp.Netで言及した「バグ」は、明らかに文書化されていないappSettings値で制御できます-'aspnet:UseHostHeaderForRequest'と呼ばれます-すなわち:

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

ILSpyのHttpRequest.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 */
       ...

私は個人的にそれを使用していません-それは文書化されていないので、固執することは保証されません-しかし、それは私が上で言及したのと同じことをするかもしれません。検索結果の関連性を高めるために-そして、これを発見したと思われる他の誰かを認めるために- 'aspnet:UseHostHeaderForRequest'設定はTwitterのNick Acevesにも言及されています

47
Andras Zoltan
public static string GetCurrentWebsiteRoot()
{
    return HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority);
}
12
Brian Ogden
Request.Url.PathAndQuery

特に、相対的なUriだけが欲しい場合(ただし、クエリ文字列を保持している場合)、完璧に動作するはずです。

11
Lucius

私もFacebookの理由でこれを探していましたが、これまでの答えがどれも必要に応じて機能したり複雑すぎたりすることはありません。

@Request.Url.GetLeftPart(UriPartial.Path)

完全なプロトコル、ホスト、およびパスをクエリ文字列なしで取得します。デフォルトの80以外のものを使用している場合は、ポートも含まれます。

8
johnw182

お気に入り...

Url.Content(Request.Url.PathAndQuery)

あるいは単に...

Url.Action()
4
Carter Medlin

他の回答で言及されていないことの1つは、大文字と小文字の区別です。複数の場所で参照される場合(これは元の質問ではありませんが、この質問は多くの類似検索で使用されるため考慮する価値があります) )他の答えに基づいて、私は以下が最初に私のために働いたのを見つけました:

Request.Url.AbsoluteUri.ToString()

しかし、より信頼性を高めるために、これは次のようになりました。

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

それから私の要求(サイトがどのドメイン名からアクセスされているかをチェックし、関連するコンテンツを表示する):

Request.Url.AbsoluteUri.ToString().ToLower().Contains("xxxx")

0
Lyall

ブラウザ履歴のケース(単一ページスタイル)

HttpContext.Request.UrlReferrer
0
Hamit YILDIRIM

私にとっては、HTTPContextname__の準備ができていないのにControllerのコンストラクターでHTTPContextname__にアクセスしようとしたときが問題でした。 Indexメソッド内に移動したときに動作しました。

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