Microsoft.AspNet.Http.HttpRequest'ten ham URL alın


89

HttpRequestAsp.Net 5 (vNext) sınıf gibi istek için URL ile ilgili çözümlenen ayrıntılar (diğer şeyler arasında) içeren Scheme, Host, Pathvb

Henüz orijinal istek URL'sini ortaya çıkaran herhangi bir yeri tespit etmedim - yalnızca bu ayrıştırılmış değerler. (Önceki versiyonlarda vardı Request.Uri)

HttpRequest'te bulunan bileşenlerden bir araya getirmek zorunda kalmadan ham URL'yi geri alabilir miyim?


1
Bu konuda daha önce dosyalanmış ancak kapatılmış bir hata görünüyor ... muhtemelen ayrıntılarını kontrol edebilirsiniz ve daha güçlü hissediyorsanız, ayrıntılarla güncelleyebilirsiniz: github.com/aspnet/HttpAbstractions/issues/110
Kiran Challa

@KiranChalla: Önceki sürümlerde RawURL'nin ne olduğunu merak etmeme neden olsa da, onların fikrini alıyorum. Sanırım şu anda şema, ana bilgisayar vb. Hakkında gösterdikleri şey, isteğin kendisinde değil, isteğin sunucu tarafında ele alınmasından anlaşılabilir.
Jon Egerton

ToString () denediniz mi?
mars'tan agua

Yanıtlar:


85

Görünüşe göre doğrudan erişemiyorsunuz, ancak çerçeveyi kullanarak oluşturabilirsiniz:

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

Yukarıdakileri bir uzatma yöntemi olarak da kullanabilirsiniz.

Bu, a stringyerine a döndürür Uri, ancak amaca hizmet etmelidir! (Bu aynı zamanda rolüne de hizmet ediyor gibi görünüyor UriBuilder.)

@ Mswietlicki'ye, eksik olmaktan çok yeniden düzenlenmiş olduğunu belirttiği için teşekkürler! Ayrıca cevabımdaki ad alanı değişikliğine dikkat çekmek için @CF'ye!


4
Bu artık beta-5'ten itibaren çalışmıyor. İyi bir alternatifim yok veya cevabımı güncellerim.
Matt DeKrey

13
Bunun gerçek bir uzantı yöntemi yapıldığına inanıyorum - sadece ad alanını içe aktarırsınız ve kullanım durumunuza bağlı olarak GetEncodedUriveya birini çağırırsınız GetDisplayUri.
dlras2

43
Microsoft.AspNet.Http.Extensions kullanarak; and that Request.GetDisplayUrl ()
mswietlicki

8
Doğru ad alanı artık Microsoft.AspNetCore.Http.Extensions
CF

9
ASP.NET Core 1.0 için Razor görünümünüze "Microsoft.AspNetCore.Http.Extensions" kullanarak ekleyin. URL'yi almak için "@ Context.Request.GetDisplayUrl ()" kullanın.
Joop

75

Nuget paketini ekleyin / şunu kullanarak:

using Microsoft.AspNetCore.Http.Extensions; 

(ASP.NET Core RC1'de bu Microsoft.AspNet.Http.Extensions içindeydi)

o zaman tam http istek url'sini aşağıdaki komutu çalıştırarak alabilirsiniz:

var url = httpContext.Request.GetEncodedUrl();

veya

var url = httpContext.Request.GetDisplayUrl();

amaçlara bağlı olarak.


ASP.NET Core RC2 şu anda kullanılabilir mi?
Sergey G.


Kaynağa bakıldığında, bunlar açıkça bazı kodlama / kod çözme işlemleri yapar, bu nedenle bu ham url olmayacaktır. Ayrıca, IIS bazen url'yi Kestrel'e ulaşmadan değiştirir, örneğin% 2F -> /.
Daniel Leach

1
@TomStickel Neden bahsettiğinizden emin değilim ... İkisini de kullanırken herhangi bir sorun yaşamadım. usingBunlar "normal" yöntemler değil, genişletme yöntemleri olduğundan, yanıtta açıklandığı gibi dosyanızda yönergenin bulunduğundan emin olun .
Nick Mertin

1
@TomStickel fuarı. ASP.NET Core 2.2 için yüklenen Microsoft.AspNetCore.All paketiyle (2.0'da da test edildi) bu benim için iyi çalışıyor.
Nick Mertin

16

Eğer varsa , gerçekten istediğiniz gerçek, çiğ URL'yi aşağıdaki uzatma yöntemi kullanabilirsiniz:

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

Bu yöntem RawTarget, HttpRequestnesnenin kendisinde ortaya çıkmayan isteğin değerini kullanır . Bu özellik, ASP.NET Core'un 1.0.0 sürümüne eklenmiştir. Bunu veya daha yeni bir sürümü çalıştırdığınızdan emin olun.

NOT! Bu özellik, işlenmemiş URL'yi ortaya çıkarır , bu nedenle belgelerde belirtildiği gibi kodu çözülmemiştir:

Bu özellik, yönlendirme veya yetkilendirme kararları için dahili olarak kullanılmaz. UrlDecoded edilmemiştir ve kullanımında dikkatli olunmalıdır.


Tam .NET Framework ile ASP .NET Core kullanıyorum. Bu benim için işe yaramıyor gibi görünüyor ( RawTargetüzerinde tanımlanmadı IHttpRequestFeature). Bir alternatif düşünebilir misin?
Tomáš Hübelbauer

1
RawTargetMayıs ayında 1.0 sürümünde eklendi . En son sürümü kullandığınızdan emin misiniz?
khellang

1
IIS kullanarak barındırma yapılıyorsa, IIS bazen url'yi Kestrel'e ulaşmadan değiştirir. Bunun bir örneği,% 2F'nin / olarak kodunun çözülmesidir.
Daniel Leach

Bu açık ara yetkili cevaptır.
Chris Marisic

Bu, URL'nin tamamı yerine URL Yolunu veriyor gibi görünüyor
Iain Ballard

12

.NET Core tıraş makinesinde:

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

İkinci satır yerine de kullanabilirsiniz:

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

9

Diğer çözümler ihtiyaçlarıma tam olarak uymadı çünkü doğrudan bir URInesne istedim ve bu durumda dize birleştirmeden kaçınmanın (ayrıca) daha iyi olduğunu düşünüyorum, bu yüzden bu uzantı yöntemlerini a kullanmak yerine oluşturdum UriBuilderve aşağıdaki gibi url'lerle de çalışır 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
İyi bir. Ayrıca çözümünüzü isteğe bağlı parametrelerle geliştirdim. Bu nedenle, URI'nin hangi bölümünü çekmek istediğimi kontrol edebilirim. Örneğin, yalnızca ana makine veya sorgu dizesi olmadan tam yol vb.
user3172616

@ user3172616 güzel fikir!
giammin

1
(80)olmalıdır (-1). "Host" başlığında atlanmış bağlantı noktasıyla https şemasına sahip olduğunuzda, bu yanlış Uri oluşturacaktır (örneğin https://myweb:80/, onunla (-1)birlikte olacaktır https://myweb).
Igor Dražić

4

Aşağıdaki uzantı yöntemi, beta5 öncesi mantığı yeniden üretir 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

Bu uzantı benim için çalışıyor:

Microsoft.AspNetCore.Http kullanarak;

    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'te:

Microsoft.AspNet.Http.Extensions.UriHelper.Encode(
    request.Scheme, request.Host, request.PathBase, request.Path, request.QueryString);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.