Как получить текущий URL-адрес в asp.net core 1.0

104

В предыдущих версиях asp.net мы могли использовать

@Request.Url.AbsoluteUri

Но, похоже, все изменилось. Как мы можем сделать это в asp.net core 1.0?

oneNiceFriend
источник
6
@DavidG Похоже, теперь вы можете использовать UriHelper.GetDisplayUrl (Re‌ quest)
Mark G

Ответы:

122

Вы должны получить хост и путь отдельно.

 @Context.Request.Host@Context.Request.Path
Клинт Б.
источник
14
Это не будет сообщать правильный URL-адрес, если ваше приложение находится в виртуальном каталоге. Вам нужно будет добавить к значению Request.Path префикс Request.PathBase, если он есть. Это относится и почти ко всем остальным ответам на этот вопрос.
Padigan
Что это @между двумя струнами? не могли бы вы это объяснить?
Мохаммед
3
@MohammedNoureldin: это синтаксис просмотра бритвы.
jack.pop
2
Для бритвенных страниц мне пришлось использовать @HttpContextвместо @Context. Для частичных просмотров @Contextработает. Я забыл об использовании?
Andriod 03
2
В MVC есть простой способ Url.Action("Action", null, null, Request.Url.Scheme); stackoverflow.com/questions/434604/…
Дэн
110

Вам нужна схема, хост, путь и queryString

@string.Format("{0}://{1}{2}{3}", Context.Request.Scheme, Context.Request.Host, Context.Request.Path, Context.Request.QueryString)

или используя новую функцию C # 6 «Строковая интерполяция»

@($"{Context.Request.Scheme}://{Context.Request.Host}{Context.Request.Path}{Context.Request.QueryString}")
tmg
источник
1
Как получить фрагмент, скажем test.com/abc#123 , как получить фрагмент # 123 из запроса?
Рэй
4
@fanray Ты не можешь. Браузеры не отправляют на сервер URI-фрагменты
tmg 02
Рассмотрите возможность использования UriBuilder для создания URL-адресов.
Эрик Филипс
86

Вы можете использовать метод расширения Request:

Request.GetDisplayUrl()
AlexBar
источник
33
Это работает, если вы добавите @using Microsoft.AspNetCore.Http.Extensionsзатем@Context.Request.GetDisplayUrl()
Серж Саган
2
все еще получается - Запрос не существует в текущем контексте
SeanMC
1
Имейте в виду, что в сводке intellisense для этой функции говорится, что Suitable only for display. This format should not be used in HTTP headers or other HTTP operations.исходя из этого, я думаю, что решение @tmg является лучшим (возможно, заключенным в ваш собственный метод расширения).
Гордон Глас
16

Очевидно, это всегда было возможно в .net core 1.0 с Microsoft.AspNetCore.Http.Extensions, которое добавляет расширение HttpRequestдля получения полного URL-адреса; GetEncodedUrl .

например, с точки зрения бритвы:

@using Microsoft.AspNetCore.Http.Extensions
...
<a href="@Context.Request.GetEncodedUrl()">Link to myself</a>

Начиная с версии 2.0, также есть относительный путь и запрос GetEncodedPathAndQuery .

mcNux
источник
15

Используйте свойство AbsoluteUri Uri, с ядром .Net вы должны создать Uri из запроса, подобного этому,

 var location = new Uri($"{Request.Scheme}://{Request.Host}{Request.Path}{Request.QueryString}");

 var url = location.AbsoluteUri;

например, если URL-адрес запроса - http://www.contoso.com/catalog/shownew.htm?date=today , будет возвращен тот же URL-адрес.

Дханука777
источник
8
Подобные вещи заставляют меня думать, что .Net Core - это в некотором смысле шаг назад. Это лучше, чем Request.Url в Asp.Net каким-то образом, который я не могу представить?
Soenhay
8

Вы можете использовать этот метод расширения (из Microsoft.AspNetCore.Http.Extensionsпространства имен:

@Context.Request.GetDisplayUrl()

Для некоторых моих проектов я предпочитаю более гибкое решение. Есть два метода расширения.

1) Первый метод создает Uriобъект из данных входящего запроса (с некоторыми вариантами через необязательные параметры). 2) Второй метод получает Uriобъект и возвращает stringв следующем формате (без косой черты в конце): Scheme_Host_Port

public static Uri GetUri(this HttpRequest request, bool addPath = true, bool addQuery = true)
    {
        var uriBuilder = new UriBuilder
        {
            Scheme = request.Scheme,
            Host = request.Host.Host,
            Port = request.Host.Port.GetValueOrDefault(80),
            Path = addPath ? request.Path.ToString() : default(string),
            Query = addQuery ? request.QueryString.ToString() : default(string)
        };
        return uriBuilder.Uri;
    }

    public static string HostWithNoSlash(this Uri uri)
    {
        return uri.GetComponents(UriComponents.SchemeAndServer, UriFormat.UriEscaped);
    }

Использование:

//before >> https://localhost:44304/information/about?param1=a&param2=b
        Request.GetUri(addQuery: false);
        //after >> https://localhost:44304/information/about

        //before >> https://localhost:44304/information/about?param1=a&param2=b
        new Uri("https://localhost:44304/information/about?param1=a&param2=b").GetHostWithNoSlash();
        //after >> https://localhost:44304
user3172616
источник
7
public string BuildAbsolute(PathString path, QueryString query = default(QueryString), FragmentString fragment = default(FragmentString))
{
    var rq = httpContext.Request;
    return Microsoft.AspNetCore.Http.Extensions.UriHelper.BuildAbsolute(rq.Scheme, rq.Host, rq.PathBase, path, query, fragment);
}
Сергей
источник
но куда ты денешься httpContext? Это не сработает, Microsoft.AspNetCore.Http.HttpContext.Request
Том Стикель
7

Если вы хотите также получить номер порта из запроса, вам потребуется получить к нему доступ через Request.Hostсвойство AspNet Core.

Request.HostСвойство не просто строка , но, вместо этого, объект , который содержит как домен хоста и номер порта. Если номер порта специально выписал в URL (то есть "https://example.com:8080/path/to/resource"), то вызов Request.Hostдаст вам домен хоста и номер порта , как так: "example.com:8080".

Если вам нужно только значение для хост-домена или значение только для номера порта, вы можете получить доступ к этим свойствам индивидуально (например, Request.Host.Hostили Request.Host.Port).

Hallmanac
источник
6

Принятый ответ помог мне, как и комментарий к нему от @padigan, но если вы хотите включить параметры строки запроса, как это было со мной, попробуйте следующее:

@Context.Request.PathBase@Context.Request.GetEncodedPathAndQuery()

И вам нужно будет добавить @using Microsoft.AspNetCore.Http.Extensionsв представление, чтобы метод GetEncodedPathAndQuery () был доступен.

Кристофер Кинг
источник
2

Существует простой способ получить текущий URL-адрес со страницы Razor или класса PageModel. То есть:

Url.PageLink()

Обратите внимание, что я имел в виду « страницы Razor ASP.NET Core », а не MVC.

Я использую этот метод, когда хочу напечатать метатег канонического URL-адреса на страницах с бритвой ASP.NET Core. Но есть загвоздка. Он предоставит вам URL-адрес, который должен быть правильным URL-адресом для этой страницы. Позволь мне объяснить.

Скажем, вы определили для своей страницы маршрут с именем "id" и, следовательно, ваш URL-адрес должен выглядеть так:

http://example.com/product?id=34

Url.PageLink () даст вам именно тот URL, как показано выше.

Теперь, если пользователь добавляет что-нибудь дополнительно к этому URL-адресу, скажем,

http://example.com/product?id=34&somethingElse

Тогда вы не получите этого "чего-то другого" из этого метода. И именно поэтому он идеально подходит для печати метатега канонического URL-адреса на странице HTML.

Эмран Хуссейн
источник