Получить необработанный URL-адрес от Microsoft.AspNet.Http.HttpRequest
В классе HttpRequest
в Asp.Net 5 (vNext) содержатся (помимо прочего) детализированные URL-адреса для запроса, такие как Scheme
, Host
, Path
и т.д.
Я еще нигде не заметил, что разоблачает исходный URL-адрес запроса - только эти анализируемые значения. (В предыдущих версиях было Request.Uri
)
Могу ли я получить необработанный URL-адрес, не связывая его вместе с компонентами, доступными в HttpRequest?
Ответы
Ответ 1
Похоже, вы не можете получить к нему доступ напрямую, но вы можете создать его с помощью рамки:
Microsoft.AspNetCore.Http.Extensions.UriHelper.GetFullUrl(Request)
Вы также можете использовать вышеуказанный метод расширения.
Это возвращает string
, а не Uri
, но это должно служить цели! (Это также похоже на роль UriBuilder
.)
Благодаря @mswietlicki за то, что он просто был реорганизован, а не пропал! А также @C-F, чтобы указать на изменение пространства имен в моем ответе!
Ответ 2
Добавьте пакет 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();
в зависимости от целей.
Ответ 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}";
}
}
Ответ 4
Следующий способ расширения воспроизводит логику из pre-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.Query;
}
Ответ 5
Если вам действительно нужен исходный 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. Убедитесь, что вы используете эту или более новую версию.
ПРИМЕЧАНИЕ! Это свойство предоставляет необработанный URL-адрес, поэтому он не был декодирован, как указано в документации:
Это свойство не используется внутренне для принятия решений о маршрутизации или авторизации. Он не был UrlDecoded, и следует соблюдать осторожность при его использовании.
Ответ 6
В ASP.NET 5 beta5:
Microsoft.AspNet.Http.Extensions.UriHelper.Encode(
request.Scheme, request.Host, request.PathBase, request.Path, request.QueryString);