web-dev-qa-db-ja.com

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

Asp.Net 5(vNext)のHttpRequestクラスには、(特に)リクエストのURLに関する解析された詳細(SchemeHostPathなど.

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

HttpRequestで使用可能なコンポーネントからつなぎ合わせる必要なく、生のURLを取得できますか?

58
Jon Egerton

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

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

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

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

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

54
Matt DeKrey

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();

目的に応じて。

40
Velin Georgiev

really実際の生の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);
    }
}

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

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

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

7
khellang

他のソリューションは、URIオブジェクトが直接必要であり、この場合は文字列の連結(も)を避けた方がよいと思うので、私のニーズにうまく適合しなかったので、UriBuilderおよびhttp://localhost:2050のようなURLでも動作します:

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

ASP.NET Core 2.xカミソリページ:

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

別の機能もあります。

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

次の拡張メソッドは、ベータ5以前の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;
}
4
Sam

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

using 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}";
        }
    }
2
Mark Redman

ASP.NET 5 beta5の場合:

Microsoft.AspNet.Http.Extensions.UriHelper.Encode(
    request.Scheme, request.Host, request.PathBase, request.Path, request.QueryString);
0
Smartkid