C#で表示しているページの完全なURLを取得する方法


163

ユーザーコントロールから、表示しているページの完全なURLにアクセスできる必要があります。一連のリクエスト変数を連結するだけの問題ですか?もしそうなら、どれですか?それとももっと簡単な方法がありますか?


5
:A、ロードバランシングwebfarm .. System.Urlを使用したときに表示されるポート番号用心の誰にstackoverflow.com/questions/7674850/...を
felickz

回答:


155

通常Request.Url.ToString()、完全なURL(クエリ文字列を含む)を取得するために使用します。連結は必要ありません。


2
URLに「#」が含まれている場合、#の後のすべての文字は含まれません。
Krunal Sisodiya 2016

5
@KrunalSisodiya URLのハッシュがサーバーに送信されることはないと思いますが、私は間違っている可能性があります。
トラビス

Request.Url.ToString()queryStringが含まれていません。
Yogesh Patel

320

このタイプの情報について私が通常参照するリストは次のとおりです。

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
1)Request.RawUrlもあります。2)Request.Urlは、「非常に悪い要求されたパス」で例外をスローする場合があります。
user2864740 2017

非常に役立つ回答ですが、混乱を避けるためにポート番号を一致させるべきではありません(すべての例が同じリクエストに対するものであると想定します。たとえば、AuthorityとPortはポート80を暗示するが、AbsoluteUriはポート2000を含む)
Young Bob

Request.QueryString返品q=qvalueのみ
Marcel

74
Request.Url.AbsoluteUri

このプロパティは、必要なすべてを1つの簡潔な呼び出しで実行します。


6
+1。これが最良の答えです。Request.Url.ToString()よりも優先する必要があります。
Todd Menier 2013

10

以下のためにASP.NET Coreあなたはそれを綴るする必要があります:

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

または、ビューにusingステートメントを追加できます。

@using Microsoft.AspNetCore.Http.Extensions

その後

@Context.Request.GetDisplayUrl()

その_ViewImports.cshtmlためのより良い場所かもしれません@using


1
ありがとう。これは役に立ちました!
FlyingV


9

httpからクエリ文字列までの完全なURLが必要な場合は、次の変数を連結する必要があります。

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

2
これは非標準のポートを考慮していません(つまり、httpにポート80を使用していません)
Spongeboy

1
Request.ServerVariables( "SERVER_PORT")を使用してポートを検出できます!
アーメン2014年

1
この回答はVB.Net構文を使用していることに注意してください。C#では、たとえば、Request.ServerVariables ["HTTPS"]を使用します。
jaycer

7

MSDNによると)Request.Url.OriginalStringよりも使用する方が良いRequest.Url.ToString()


元の文字列が本当に必要な場合のみ、より良い方法です。
Dirk

@DirkThe from MSDN上記のリンク: "ToStringメソッドによって返された文字列には、コンソールアプリケーションの状態を破壊する可能性のある制御文字が含まれている可能性があります。GetComponentsメソッドをUriFormat.SafeUnescaped形式で使用して、返された文字列から制御文字を削除できます。 」
Eni

まさに、それはとは何の関係もありませんOriginalString
Dirk

5

皆さん、ありがとうございました。私の特定のニーズのために、@ Christianと@Jonathanの両方を組み合わせて使用​​しました。

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

安全なhttpについて心配する必要はありません。servername変数が必要です。RawUrlはドメイン名からのパスを処理し、存在する場合はクエリ文字列を含めます。


2
また、URLマッピングが使用されている場合、RawUrlは、Request.Urlとは異なり、元のマップされていないリクエストURLを表すことも知っておく必要があります。
harpo

SERVER_NAMEは、クライアントが使用する「実際の」URLを返さないことがよくあります。直接掘り下げる場合は、おそらくHTTP_HOSTの方が適しています。また、単純なHTTP-to-another-portを見逃しています。
user2864740 2017

1

ポート番号も必要な場合は、使用できます

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;
}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.