Dapatkan URL mentah dari Microsoft.AspNet.Http.HttpRequest

89

The HttpRequestkelas di Asp.Net 5 (vNext) mengandung (antara lain) rincian diurai tentang URL untuk permintaan, seperti Scheme, Host, Pathdll

Saya belum melihat di mana pun yang memperlihatkan URL permintaan asli - hanya nilai yang diuraikan ini. (Di versi sebelumnya ada Request.Uri)

Bisakah saya mendapatkan kembali URL mentah tanpa harus menyatukannya dari komponen yang tersedia di HttpRequest?

Jon Egerton
sumber
1
Bug tampaknya telah diajukan sebelumnya tentang ini tetapi ditutup ... Anda mungkin dapat memeriksa detailnya dan jika Anda merasa lebih kuat tentangnya, dapat memperbaruinya dengan detail: github.com/aspnet/HttpAbstractions/issues/110
Kiran Challa
@KiranChalla: Saya mengerti maksud mereka, meskipun itu membuat saya bertanya-tanya apa itu RawURL di versi sebelumnya. Saya rasa apa yang mereka tunjukkan saat ini tentang skema, host dll dapat ditentukan dari sisi server yang menangani permintaan tersebut, dan bukan apa pun pada permintaan itu sendiri.
Jon Egerton
apakah Anda mencoba ToString ()?
agua dari mars

Jawaban:

85

Sepertinya Anda tidak dapat mengaksesnya secara langsung, tetapi Anda dapat membuatnya menggunakan kerangka kerja:

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

Anda juga dapat menggunakan metode di atas sebagai metode ekstensi.

Ini mengembalikan a stringdaripada a Uri, tetapi itu harus memenuhi tujuan! (Ini juga tampaknya melayani peran itu UriBuilderjuga.)

Terima kasih kepada @mswietlicki karena menunjukkan bahwa itu baru saja difaktorisasi, bukan hilang! Dan juga ke @CF untuk menunjukkan perubahan namespace di jawaban saya!

Matt DeKrey
sumber
4
Ini tidak lagi berfungsi pada beta-5. Saya tidak memiliki alternatif yang baik atau akan memperbarui jawaban saya.
Matt DeKrey
13
Saya yakin ini adalah metode ekstensi yang sebenarnya - Anda cukup mengimpor namespace dan memanggil salah satunya GetEncodedUriatau GetDisplayUri, tergantung pada kasus penggunaan Anda.
dlras2
43
menggunakan Microsoft.AspNet.Http.Extensions; dan Request.GetDisplayUrl () itu
mswietlicki
8
Namespace yang tepat sekarang adalah Microsoft.AspNetCore.Http.Extensions
CF
9
Untuk ASP.NET Core 1.0 tambahkan menggunakan "Microsoft.AspNetCore.Http.Extensions" ke tampilan Razor Anda. Untuk mendapatkan url gunakan "@ Context.Request.GetDisplayUrl ()".
Joop
75

Tambahkan Paket Nuget / Menggunakan:

using Microsoft.AspNetCore.Http.Extensions; 

(Di ASP.NET Core RC1 ini ada di Microsoft.AspNet.Http.Extensions)

maka Anda bisa mendapatkan url permintaan http lengkap dengan menjalankan:

var url = httpContext.Request.GetEncodedUrl();

atau

var url = httpContext.Request.GetDisplayUrl();

tergantung tujuannya.

Velin Georgiev
sumber
Apakah ASP.NET Core RC2 tersedia sekarang?
Sergey G.
Melihat sumber, ini jelas melakukan beberapa encoding / decoding sehingga ini tidak akan menjadi url mentah. Selain itu, IIS terkadang akan mengubah url sebelum sampai ke Kestrel misalnya% 2F -> /.
Daniel Leach
1
@TomStickel Tidak yakin apa yang Anda bicarakan ... Saya tidak punya masalah menggunakan keduanya. Pastikan Anda memiliki usingdirektif di file Anda seperti yang dijelaskan dalam jawaban, karena ini bukan metode "normal", melainkan metode ekstensi.
Nick Mertin
1
@TwitAsahOtak. Hanya mencatat bahwa dengan paket Microsoft.AspNetCore.All terinstal untuk ASP.NET Core 2.2 (juga diuji pada 2.0), ini berfungsi dengan baik untuk saya.
Nick Mertin
16

Jika Anda benar - benar menginginkan URL mentah yang sebenarnya , Anda dapat menggunakan metode ekstensi berikut:

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

Metode ini menggunakan RawTargetpermintaan, yang tidak muncul di HttpRequestobjek itu sendiri. Properti ini ditambahkan pada rilis 1.0.0 ASP.NET Core. Pastikan Anda menjalankannya atau versi yang lebih baru.

CATATAN! Properti ini memperlihatkan URL mentah , sehingga belum didekodekan, seperti yang dicatat oleh dokumentasi:

Properti ini tidak digunakan secara internal untuk keputusan perutean atau otorisasi. Ini belum di-UrlDecoded dan harus hati-hati dalam menggunakannya.

khellang
sumber
Saya menggunakan ASP .NET Core dengan full .NET Framework. Ini sepertinya tidak berhasil untuk saya ( RawTargettidak ditentukan pada IHttpRequestFeature). Bisakah Anda memikirkan sebuah alternatif?
Tomáš Hübelbauer
1
RawTargettelah ditambahkan pada rilis 1.0, pada bulan Mei . Apakah Anda yakin Anda menggunakan versi terbaru?
khellang
1
Jika hosting menggunakan IIS, IIS terkadang akan mengubah url sebelum sampai ke Kestrel. Salah satu Contoh ini adalah% 2F diterjemahkan ke /.
Daniel Leach
Sejauh ini, inilah jawaban yang berwibawa.
Chris Marisic
Ini tampaknya memberikan Jalur URL daripada seluruh URL
Iain Ballard
12

Dalam pisau cukur .NET Core:

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

Anda juga dapat menggunakan sebagai pengganti baris kedua:

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

Solusi lain tidak sesuai dengan kebutuhan saya karena saya ingin langsung sebuah URIobjek dan saya pikir lebih baik untuk menghindari penggabungan string (juga) dalam hal ini jadi saya membuat metode ekstensi ini daripada menggunakan a UriBuilderdan bekerja juga dengan url seperti 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;
}
giammin
sumber
1
Bagus. Saya juga meningkatkan solusi Anda dengan parameter opsional. Oleh karena itu saya dapat mengontrol bagian mana dari URI yang ingin saya ambil. Misalnya, hanya host atau jalur lengkap tanpa string kueri, dll.
user3172616
@ user3172616 ide bagus!
giammin
1
(80)seharusnya (-1). Jika Anda memiliki skema https dengan port dihilangkan di header "Host", ini akan menghasilkan Uri yang salah (misalnya https://myweb:80/, dengan (-1)itu akan terjadi https://myweb).
Igor Dražić
4

Metode ekstensi berikut mereproduksi logika dari pra-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;
}
Sam
sumber
3

Ekstensi ini berfungsi untuk saya:

menggunakan 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}";
        }
    }
Mark Redman
sumber
0

Di ASP.NET 5 beta5:

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