Avatar ·

Как получить URL текущей страницы в ASP.NET C#?

Всем привет! Я новичок в C# и ASP.NET, и у меня возникла, казалось бы, простая проблема. Мне нужно получить полный адрес текущей страницы, на которой находится пользователь, чтобы, например, передать его в ссылку для обратной связи или сохранить в лог. Я перепробовал несколько вариантов, но ни один не работает так, как я ожидаю. Вот что я пытался: ```csharp // Попытка 1: Просто Request.Url string url = Request.Url.ToString(); // Выдает что-то странное, типа http://localhost:5000/Default.aspx, но без параметров // Попытка 2: HttpContext.Current string currentUrl = HttpContext.Current.Request.Url.AbsoluteUri; // Вроде работает, но иногда возвращает null // Попытка 3: Использование Page.Request string pageUrl = Page.Request.Url.ToString(); // Ошибка: "Page" не существует в текущем контексте ``` Я работаю с Web Forms (старый проект), но также хочу понять, как это сделать в ASP.NET MVC и Razor Pages. Мне нужно получать: 1. Полный URL (с http/https, доменом, портом, путем и query-параметрами). 2. Только путь (без домена). 3. Только query-строку. Подскажите, пожалуйста, какой правильный и надёжный способ? А то у меня то исключения вылетают, то пустая строка приходит. Заранее спасибо! <<>>

Основные способы получения URL текущей страницы в ASP.NET

Проблема, с которой вы столкнулись, очень типична для начинающих. Дело в том, что в разных технологиях ASP.NET (Web Forms, MVC, Razor Pages, Core) способы доступа к URL немного отличаются. Давайте разберём универсальные и правильные подходы.

1. ASP.NET Web Forms (традиционный)

В Web Forms у вас есть доступ к объекту Request через свойство страницы Page или напрямую, если вы находитесь в коде страницы (code-behind).

// Полный URL (схема + хост + путь + query)
string fullUrl = Request.Url.AbsoluteUri; 
// Результат: "https://example.com/page.aspx?id=123"

// Только путь (без query)
string path = Request.Url.AbsolutePath;
// Результат: "/page.aspx"

// Query-строка (без знака вопроса)
string query = Request.Url.Query;
// Результат: "?id=123"

// Только имя хоста
string host = Request.Url.Host;
// Результат: "example.com"

Важно: Не используйте HttpContext.Current в Web Forms без проверки на null. Лучше обращаться к this.Request внутри класса страницы.

2. ASP.NET MVC / Razor Pages (старый .NET Framework)

В контроллерах MVC и PageModel Razor Pages доступ к Request аналогичен:

// В контроллере MVC
public ActionResult Index()
{
    string currentUrl = Request.Url.AbsoluteUri;
    return View();
}

// В PageModel Razor Pages
public class IndexModel : PageModel
{
    public void OnGet()
    {
        string url = Request.Url.AbsoluteUri;
    }
}

3. ASP.NET Core (современный подход)

В ASP.NET Core API изменился. Здесь нет свойства Request.Url. Вместо него используется HttpRequest с конструктором URI:

// Полный URL
string fullUrl = $"{Request.Scheme}://{Request.Host}{Request.Path}{Request.QueryString}";

// Или более элегантно через вспомогательный метод
var uri = new Uri($"{Request.Scheme}://{Request.Host}{Request.Path}{Request.QueryString}");
string absoluteUrl = uri.AbsoluteUri;

// Только путь
string path = Request.Path;

// Query-строка
string query = Request.QueryString.Value;

Рекомендация для Core: Создайте extension-метод для удобства:

public static class HttpRequestExtensions
{
    public static Uri GetAbsoluteUri(this HttpRequest request)
    {
        return new Uri($"{request.Scheme}://{request.Host}{request.Path}{request.QueryString}");
    }
}

// Использование:
string url = Request.GetAbsoluteUri().AbsoluteUri;

Почему ваш код не работал?

  • Request.Url.ToString() — работает, но возвращает URL с портом (например, :5000). Если вам нужно без порта, используйте Request.Url.GetLeftPart(UriPartial.Authority).
  • HttpContext.Current.Request.Url.AbsoluteUri — может быть null, если код выполняется не в контексте HTTP-запроса (например, в фоновой задаче или при старте приложения). Всегда проверяйте HttpContext.Current != null.
  • Page.Request — ошибка возникает, потому что Page — это класс, а не свойство. В Web Forms нужно использовать this.Page.Request или просто Request.

Универсальный совет

Если вы пишете библиотеку или код, который должен работать в разных версиях ASP.NET, используйте интерфейс IHttpContextAccessor (для Core) или проверяйте HttpContext.Current (для Framework). Но в рамках одного проекта лучше придерживаться специфичного для технологии подхода.

<<>>

Альтернативный подход: получение URL через JavaScript и передача на сервер

Иногда проще получить URL на клиенте и передать его на сервер, особенно если вам нужен точный адрес, который видит пользователь (включая хэш-часть #, которая не передаётся на сервер).

// JavaScript (например, в Razor View)
<script>
    var currentUrl = window.location.href;
    // Отправляем на сервер через скрытое поле или AJAX
    document.getElementById('hiddenUrl').value = currentUrl;
</script>

// На сервере (C#)
string clientUrl = Request.Form["hiddenUrl"];

Этот метод полезен, когда:

  • Вам нужно получить URL после редиректов на клиенте.
  • Сайт использует SPA (Single Page Application) с изменением хэша.
  • Вы хотите избежать проблем с прокси-серверами или балансировщиками нагрузки, которые могут искажать URL.

Однако помните: этот способ требует, чтобы JavaScript был включён у пользователя, и добавляет лишний сетевой запрос. Для большинства серверных задач лучше использовать методы из первого ответа.