Microsoft.AspNet.Http.HttpRequestから生のURLを取得します


89

HttpRequestAsp.Net 5(vNext)内のクラスは、以下のような要求のためのURLについて解析された内容、(とりわけ)が含まれSchemeHostPathなど

ただし、元のリクエストURLを公開している場所はまだ見つかりませんでした。これらの解析された値のみです。(以前のバージョンにはありましたRequest.Uri

HttpRequestで利用可能なコンポーネントからURLをつなぎ合わせる必要なしに、生のURLを取り戻すことはできますか?


1
これについては以前にバグが報告されたようですが、クローズされています...おそらく詳細を確認できます。さらに強く感じた場合は、詳細を更新してください:github.com/aspnet/HttpAbstractions/issues/110
キランチャラ2015年

@KiranChalla:私は彼らの主張を理解していますが、以前のバージョンのRawURLは何であるか疑問に思います。彼らが現在スキームやホストなどについて示していることは、リクエスト自体のサーバー側の処理ではなく、リクエストのサーバー側の処理から判断できると思います。
Jon Egerton 2015年

ToString()を試しましたか?
火星からのアグア

回答:


85

直接アクセスできないようですが、フレームワークを使用してビルドできます。

Microsoft.AspNetCore.Http.Extensions.UriHelper.GetFullUrl(Request)

上記を拡張メソッドとして使用することもできます。

これはではstringなくを返しますUriが、目的を果たすはずです!(これもの役割を果たしているようUriBuilderです。)

@mswietlickiが欠落しているのではなく、リファクタリングされたばかりであることを指摘してくれてありがとう!また、@ CFに、私の答えの名前空間の変更を指摘してください!


4
これはベータ5以降は機能しなくなりました。私には良い選択肢がないか、答えを更新します。
Matt DeKrey 2015年

13
これは真の拡張メソッドになっていると思います。ユースケースに応じて、名前空間をインポートし、GetEncodedUriまたはのいずれかを呼び出すだけGetDisplayUriです。
dlras2 2015

43
Microsoft.AspNet.Http.Extensionsを使用します。そしてそのRequest.GetDisplayUrl()
mswietlicki 2016

8
右の名前空間は、今Microsoft.AspNetCore.Http.Extensionsある
CF

9
ASP.NET Core 1.0の場合、使用する「Microsoft.AspNetCore.Http.Extensions」をRazorビューに追加します。URLを取得するには、「@ Context.Request.GetDisplayUrl()」を使用します。
Joop 2016

75

Nugetパッケージを追加します/使用:

using Microsoft.AspNetCore.Http.Extensions; 

(ASP.NET Core RC1では、これはMicrosoft.AspNet.Http.Extensionsにありました)

次に、以下を実行して完全なhttpリクエストURLを取得できます。

var url = httpContext.Request.GetEncodedUrl();

または

var url = httpContext.Request.GetDisplayUrl();

目的に応じて。


ASP.NET Core RC2は現在利用できますか?
セルゲイG.


ソースを見ると、これらは明らかにいくつかのエンコード/デコードを行っているため、これは生のURLではありません。また、IISは、Kestrelに到達する前にURLを変更することがあります(例:%2F-> /)。
ダニエルリーチ2017

1
@TomStickel何を話しているのかわからない...どちらを使っても問題はなかった。usingこれらは「通常の」メソッドではなく、拡張メソッドであるため、回答に記載されているように、ファイルにディレクティブがあることを確認してください。
NickMertin19年

1
@TomStickelフェア。ASP.NET Core 2.2用にインストールされたMicrosoft.AspNetCore.Allパッケージ(2.0でもテスト済み)を使用すると、これは問題なく機能します。
NickMertin19年

16

実際の生のURL本当に必要な場合は、次の拡張メソッドを使用できます。

public static class HttpRequestExtensions
{
    public static Uri GetRawUrl(this HttpRequest request)
    {
        var httpContext = request.HttpContext;

        var requestFeature = httpContext.Features.Get<IHttpRequestFeature>();

        return new Uri(requestFeature.RawTarget);
    }
}

このメソッドはRawTargetHttpRequestオブジェクト自体には表示されないリクエストのを利用します。このプロパティは、ASP.NETCoreの1.0.0リリースで追加されました。それ以降のバージョンを実行していることを確認してください。

注意!このプロパティは生のURLを公開するため、ドキュメントに記載されているように、デコードされていません。

このプロパティは、ルーティングまたは承認の決定に内部的に使用されません。UrlDecodedされていないため、使用には注意が必要です。


完全な.NETFrameworkでASP.NETCoreを使用しています。これは私にはうまくいかないようです(RawTargetで定義されていませんIHttpRequestFeature)。代替案を考えられますか?
トマーシュHübelbauer

1
RawTarget1.0リリースで追加され、5月に戻った。最新バージョンで実行していますか?
khellang 2016

1
IISを使用してホスティングしている場合、IISは変更されることがあり、Kestrelに到達する前にURLを変更します。この一例は、%2Fが/にデコードされることです。
ダニエルリーチ2017

これは断然権威ある答えです。
ChrisMarisic18年

これは、URL全体ではなくURLパスを提供しているようです
IainBallard20年

12

.NET Coreかみそりの場合:

@using Microsoft.AspNetCore.Http.Extensions
@Context.Request.GetEncodedUrl() //Use for any purpose (encoded for safe automation)

2行目の代わりに使用することもできます。

@Context.Request.GetDisplayUrl() //Use to display the URL only

9

他のソリューションは、URIオブジェクトを直接必要としていたため、私のニーズにうまく適合しませんでした。この場合、文字列の連結を回避する方がよいと思います。そのため、を使用するよりもこの拡張メソッドを作成し、次のUriBuilderようなURLでも機能しますhttp://localhost:2050

public static Uri GetUri(this HttpRequest request)
{
    var uriBuilder = new UriBuilder
    {
        Scheme = request.Scheme,
        Host = request.Host.Host,
        Port = request.Host.Port.GetValueOrDefault(80),
        Path = request.Path.ToString(),
        Query = request.QueryString.ToString()
    };
    return uriBuilder.Uri;
}

1
良いもの。また、オプションのパラメーターを使用してソリューションを改善しました。したがって、URIのどの部分を取得するかを制御できます。たとえば、ホストのみ、またはクエリ文字列を含まないフルパスなど
user31726 1619

@ user3172616いいアイデア!
giammin

1
(80)である必要があります(-1)。「Host」ヘッダーでポートが省略されたhttpsスキームがある場合、これは間違ったUriを生成します(たとえばhttps://myweb:80/(-1)それを使用するとhttps://myweb)。
イゴールDražić

4

次の拡張メソッドは、pre-beta5のロジックを再現していますUriHelper

public static string RawUrl(this HttpRequest request) {
    if (string.IsNullOrEmpty(request.Scheme)) {
        throw new InvalidOperationException("Missing Scheme");
    }
    if (!request.Host.HasValue) {
        throw new InvalidOperationException("Missing Host");
    }
    string path = (request.PathBase.HasValue || request.Path.HasValue) ? (request.PathBase + request.Path).ToString() : "/";
    return request.Scheme + "://" + request.Host + path + request.QueryString;
}

3

この拡張機能は私のために機能します:

Microsoft.AspNetCore.Httpを使用する;

    public static class HttpRequestExtensions
    {
        public static string GetRawUrl(this HttpRequest request)
        {
            var httpContext = request.HttpContext;
            return $"{httpContext.Request.Scheme}://{httpContext.Request.Host}{httpContext.Request.Path}{httpContext.Request.QueryString}";
        }
    }

0

ASP.NET 5 beta5の場合:

Microsoft.AspNet.Http.Extensions.UriHelper.Encode(
    request.Scheme, request.Host, request.PathBase, request.Path, request.QueryString);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.