asp.netコア1.0で現在のURLを表示する方法


102

asp.netの以前のバージョンでは、

@Request.Url.AbsoluteUri

しかし、変更されたようです。asp.netコア1.0でそれを行うにはどうすればよいですか?



6
@DavidG UriHelper.GetDisplayUrl(Re‌ quest)を使用できるようになりました
Mark G

回答:


120

ホストとパスを個別に取得する必要があります。

 @Context.Request.Host@Context.Request.Path

14
アプリが仮想ディレクトリにある場合、これは正しいURLを報告しません。あなたは接頭辞にする必要がありますRequest.Pathので値をRequest.PathBaseのものがある場合は、値。これは、この質問に対する他のほとんどすべての回答にも当てはまります。
パディガン2017年

@2つの文字列の間のこれは何ですか?説明していただけますか?
Mohammed Noureldin 2017

3
@MohammedNoureldin:かみそりビューの構文です。
jack.pop 2018年

2
かみそりのページでは、の@HttpContext代わりに使用する必要がありました@Context。部分ビューでは@Context機能します。私は使用を忘れましたか?
Andriod

2
簡単な方法は、MVCであり Url.Action("Action", null, null, Request.Url.Scheme); stackoverflow.com/questions/434604/...
ダン

110

スキーム、ホスト、パス、クエリ文字列が必要です

@string.Format("{0}://{1}{2}{3}", Context.Request.Scheme, Context.Request.Host, Context.Request.Path, Context.Request.QueryString)

または新しいC#6機能「文字列補間」を使用する

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

1
フラグメントをどのように取得しますか(test.com/abc#123など)、リクエストから#123フラグメントをどのように取得しますか?
レイ

4
@fanrayできません。ブラウザがURIフラグメントをサーバーに送信しない
tmg

UriBuilderを使用してURLを作成することを検討してください。
Erik Philips、

84

次の拡張メソッドを使用できますRequest

Request.GetDisplayUrl()

33
これは、@using Microsoft.AspNetCore.Http.Extensions次に追加した場合に機能します@Context.Request.GetDisplayUrl()
Serj Sagan

2
まだ取得中-リクエストは現在のコンテキストに存在しません
SeanMC '27

1
この関数のインテリセンスの要約では、これにSuitable only for display. This format should not be used in HTTP headers or other HTTP operations.基づいて、@ tmgのソリューションが最適だと思います(おそらく、独自の拡張メソッドにラップされています)。
ゴードングラス

16

これは明らかに、.netコア1.0で常に可能でした。これによりMicrosoft.AspNetCore.Http.ExtensionsHttpRequest完全なURLを取得するための拡張機能が追加されます。GetEncodedUrl

かみそりビューから:

@using Microsoft.AspNetCore.Http.Extensions
...
<a href="@Context.Request.GetEncodedUrl()">Link to myself</a>

2.0以降、相対パスとクエリGetEncodedPathAndQueryも含まれています。


15

UriのAbsoluteUriプロパティを使用します。.Netコアでは、このようなリクエストからUriを構築する必要があります。

 var location = new Uri($"{Request.Scheme}://{Request.Host}{Request.Path}{Request.QueryString}");

 var url = location.AbsoluteUri;

たとえば、リクエストURLが ' http://www.contoso.com/catalog/shownew.htm?date=today 'の場合、これは同じURLを返します。


8
このようなことから、.Net Coreはいくつかの点で後退していると思います。これは、Asp.NetのRequest.Urlよりも、想像できないほど優れているのでしょうか。
Soenhay、2018

8

この拡張メソッドの使用を検討できMicrosoft.AspNetCore.Http.Extensionsます(名前空間から:

@Context.Request.GetDisplayUrl()

一部のプロジェクトでは、より柔軟なソリューションを好んでいます。2つの拡張メソッドがあります。

1)最初のメソッドはUri、着信要求データからオブジェクトを作成します(オプションのパラメーターを介して一部のバリアントを使用)。2)2番目のメソッドはUriオブジェクトを受け取りstring、次の形式(末尾のスラッシュなし)で返します:Scheme_Host_Port

public static Uri GetUri(this HttpRequest request, bool addPath = true, bool addQuery = true)
    {
        var uriBuilder = new UriBuilder
        {
            Scheme = request.Scheme,
            Host = request.Host.Host,
            Port = request.Host.Port.GetValueOrDefault(80),
            Path = addPath ? request.Path.ToString() : default(string),
            Query = addQuery ? request.QueryString.ToString() : default(string)
        };
        return uriBuilder.Uri;
    }

    public static string HostWithNoSlash(this Uri uri)
    {
        return uri.GetComponents(UriComponents.SchemeAndServer, UriFormat.UriEscaped);
    }

使用法:

//before >> https://localhost:44304/information/about?param1=a&param2=b
        Request.GetUri(addQuery: false);
        //after >> https://localhost:44304/information/about

        //before >> https://localhost:44304/information/about?param1=a&param2=b
        new Uri("https://localhost:44304/information/about?param1=a&param2=b").GetHostWithNoSlash();
        //after >> https://localhost:44304

7
public string BuildAbsolute(PathString path, QueryString query = default(QueryString), FragmentString fragment = default(FragmentString))
{
    var rq = httpContext.Request;
    return Microsoft.AspNetCore.Http.Extensions.UriHelper.BuildAbsolute(rq.Scheme, rq.Host, rq.PathBase, path, query, fragment);
}

しかし、どこで入手していhttpContextますか?それはうまくいきません Microsoft.AspNetCore.Http.HttpContext.Request
Tom Stickel

7

リクエストからポート番号も取得する場合はRequest.Host、AspNet Coreのプロパティを介してポート番号にアクセスする必要があります。

Request.Hostプロパティは、代わりに、ホストドメインの両方保持するオブジェクト単純に文字列ではなく、およびポート番号を。URLにポート番号が具体的に記述されている場合(つまり"https://example.com:8080/path/to/resource")、呼び出しRequest.Hostによってホストドメインとポート番号が次のように表示されます"example.com:8080"

ホストドメインの値のみが必要な場合、またはポート番号の値のみが必要な場合は、それらのプロパティに個別にアクセスできます(つまりRequest.Host.HostまたはRequest.Host.Port)。


6

@padiganからのコメントと同様に、受け入れられた回答が私を助けましたが、クエリ文字列パラメーターを含めたい場合は、これを試してください:

@Context.Request.PathBase@Context.Request.GetEncodedPathAndQuery()

また@using Microsoft.AspNetCore.Http.Extensions、GetEncodedPathAndQuery()メソッドを使用できるようにするには、ビューに追加する必要 があります。


1

RazorページまたはPageModelクラスから現在のURLを取得するクリーンな方法があります。あれは:

Url.PageLink()

MVCではなく、「ASP.NET Core Razorページ」を意味したことに注意してください。

ASP.NET Coreかみそりのページで正規URLメタタグを印刷するときに、この方法を使用します。しかし、落とし穴があります。それはあなたにそのページの正しいURLであるはずのURLを与えます。説明させてください。

たとえば、ページに定義したルートに従って、URLは次のようになります

http://www.myWebsite.com/product?id=34

たとえば、ページのルート「Id」を定義したとします。したがって、Url.PageLink()は正確にそのURLを提供します。ユーザーがそのURLに何か追加すると、

http://www.myWebsite.com/product?id=34&somethingElse

その後、このメソッドからその「somethingElse」を取得しません。そしてそれが、HTMLページで標準URLメタタグを印刷するのにぴったりの理由です。

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