Отримайте необроблену URL-адресу з Microsoft.AspNet.Http.HttpRequest


88

HttpRequestКлас в Asp.Net 5 (vNext) містить (крім усього іншого) розглядуваної докладної інформації про URL для запиту, таких як Scheme, Host, і Pathт.д.

Я ще ніде не помітив, що відкриває оригінальну URL-адресу запиту - лише ці проаналізовані значення. (У попередніх версіях було Request.Uri)

Чи можу я повернути необроблену URL-адресу без необхідності складати її з компонентів, доступних у HttpRequest?


1
Здається, про цю помилку було повідомлено раніше, але закрито ... Ви, напевно, можете перевірити її деталі, і якщо вам здається сильнішим щодо цього, можливо, оновити її деталями: github.com/aspnet/HttpAbstractions/issues/110
Kiran Challa

@KiranChalla: Я начебто сприймаю їх думку, хоча це змушує мене задуматися, що таке RawURL у попередніх версіях. Я думаю, те, що вони показують на даний момент про схему, хост і т.д., можна визначити з боку обробки запиту на стороні сервера, а не з самого запиту.
Джон Егертон,

ви пробували ToString ()?
agua з березня

Відповіді:


82

Схоже, ви не можете отримати до нього безпосередній доступ, але ви можете створити його, використовуючи фреймворк:

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

Ви також можете використовувати вищезазначене як метод розширення.

Це повертає stringшвидше, ніж a Uri, але це повинно служити цілі! (Це, схоже, теж виконує роль " UriBuilder).

Дякуємо @mswietlicki за те, що він зазначив, що його просто реконструювали, а не зникли! А також до @CF вказати на зміну простору імен у моїй відповіді!


4
Це вже не працює з бета-5. У мене немає хорошої альтернативи або я би оновив свою відповідь.
Matt DeKrey

13
Я вважаю, що це був справжній метод розширення - ви просто імпортуєте простір імен і викликаєте або, GetEncodedUriабо GetDisplayUri, залежно від вашого випадку використання.
dlras2

42
використання Microsoft.AspNet.Http.Extensions; and that Request.GetDisplayUrl ()
mswietlicki

8
Правильний простір імен тепер Microsoft.AspNetCore.Http.Extensions
CF

9
Для ASP.NET Core 1.0 додайте за допомогою "Microsoft.AspNetCore.Http.Extensions" до подання Razor. Щоб отримати URL-адресу, використовуйте "@ Context.Request.GetDisplayUrl ()".
Джоп

75

Додайте пакет Nuget / використовуючи:

using Microsoft.AspNetCore.Http.Extensions; 

(В ASP.NET Core RC1 це було в Microsoft.AspNet.Http.Extensions)

тоді ви можете отримати повну URL-адресу запиту http, виконавши:

var url = httpContext.Request.GetEncodedUrl();

або

var url = httpContext.Request.GetDisplayUrl();

залежно від цілей.


Чи доступний ASP.NET Core RC2 зараз?
Сергій Г.


Дивлячись на джерело, вони чітко виконують кодування / декодування, тому це не буде вихідною URL-адресою. Крім того, IIS іноді змінюватиме URL-адресу, перш ніж потрапити до Kestrel, наприклад% 2F -> /.
Даніель Ліч

1
@TomStickel Не впевнений, про що ви говорите ... Я не мав жодної проблеми з використанням жодного з них. Переконайтесь, що у вас є usingдиректива у вашому файлі, як описано у відповіді, оскільки це не "звичайні" методи, а швидше методи розширення.
Нік

1
@TomStickel ярмарок. Тільки зауваживши, що з пакетом Microsoft.AspNetCore.All, встановленим для ASP.NET Core 2.2 (також перевіреним на 2.0), це прекрасно працює для мене.
Нік

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

Цей метод використовує RawTargetзапит, який не відображається на самому HttpRequestоб'єкті. Цю властивість було додано до випуску 1.0.0 ASP.NET Core. Переконайтеся, що ви використовуєте цю або новішу версію.

ПРИМІТКА! Ця властивість відкриває необроблену URL-адресу, тому вона не розшифрована, як зазначено в документації:

Ця властивість не використовується внутрішньо для прийняття рішень про маршрутизацію або авторизацію. Це не було UrlDecoded, і слід бути обережним при його використанні.


Я використовую ASP .NET Core з повною .NET Framework. Здається, це не працює для мене ( RawTargetне визначено далі IHttpRequestFeature). Чи можете ви придумати альтернативу?
Томаш Хюбельбауер

1
RawTargetбуло додано до випуску 1.0, ще в травні . Ви впевнені, що використовуєте останню версію?
khellang

1
Якщо хостинг використовує IIS, IIS іноді змінюється, змінюючи URL-адресу, перш ніж потрапити до Kestrel. Одним з прикладів цього є% 2F, який декодується до /.
Даніель Ліч

Це безумовно авторитетна відповідь.
Кріс Марісіч

Здається, це дає шлях до URL-адреси, а не до цілої URL-адреси
Іен Баллард,

10

У бритві .NET Core:

@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

8

Інші рішення не відповідали моїм потребам, оскільки я хотів безпосередньо URIоб’єкт, і я вважаю, що краще уникати конкатенації рядків (також) у цьому випадку, тому я створив ці методи розширення, ніж використовувати a, 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 я хочу отримати. Наприклад, лише хост або повний шлях без рядка запиту тощо
user3172616

@ user3172616 приємна ідея!
giammin

1
(80)повинно бути (-1). Коли у вас є схема https, порт опущений у заголовку "Хост", це генерує неправильний Uri (наприклад https://myweb:80/, з (-1)ним буде https://myweb).
Ігор

4

Наступний метод розширення відтворює логіку попередньої бета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;
}

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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.