Як отримати посилання URL-адреси в ASP.NET Core MVC?


99

Я намагаюся перенести веб-форму ASP.NET MVC до ASP.NET Core MVC. Зараз у мене проблеми з Request.UrlReferrerкласом.

Оригінальний рядок:

    [HttpPost]
    public async Task<ActionResult> ContactUsFormSubmit(ContactUs request)
    {
        var siteUrl = Request.UrlReferrer.ToString().ToLower();
        ....
    }

Однак у ASP.NET Core UrlReferrer недоступний. Я знайшов таке:

    Request.Headers["Referer"]

який повертає StringValues ​​замість String. Я не впевнений, чи варто намагатися використовувати його, чи є якісь інші шляхи вирішення цієї ситуації. Request.ServerVariablesтакож недоступний, або, можливо, у мене немає простору імен. Мої простори імен такі:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

Я був би дуже вдячний, якщо хтось зможе направити мене у правильному напрямку.


1
Деякі сайти, такі як Google, не надають вам реферера з міркувань безпеки. З очей Google: Google не хоче, щоб ви бачили текст пошуку, який був би частиною реферала.
Бенджамін Абт,

FYI: URL Referer не є надійним.
Перемога

Відповіді:


152

Ви майже там. StringValuesКлас тільки тип ASP.NET використовує для ефективного представлення рядків в рамках. Особливо в HttpContextоб'єкті. Ви можете просто зателефонувати ToString()йому, щоб перетворити його на рядок:

string referer = Request.Headers["Referer"].ToString();

1
Чи вважаєте ви, що це надійний спосіб зробити це? Чи існують альтернативні шляхи?
Кемаль Тезер Ділсіз

4
Це надійно з точки зору доступу до власності з заголовків запитів, що надсилаються клієнтом. Однак я не вважав би значення заголовка реферала, що надсилається клієнтом, надійним, оскільки його дуже легко загартувати.
Henk Mollema

69
Для тих, хто цікавиться, чи неправильно написано Referer в анвері, це не так. Незважаючи на те, що Referrer є правильним написанням, вони ввели помилку в специфікації HTTP english.stackexchange.com/questions/42630/referer-or-referrer/…
Франк

1
Ви можете знайти все, що стосується міграцій обробників HTTP та модулів до ASP.net Core: docs.microsoft.com/en-us/aspnet/core/migration/http-modules
AlexGH

1
@FrankRem Вузол, що Ай, я геть геніальний, але це досить смішно. Чи виправданий винуватець, який неправильно написав його?
Michael Tranchida,


9

Ось як я отримав посилання на url: -

@{
string referer = Context.Request.Headers["Referer"].ToString();
Uri baseUri = new Uri(referer);}


<form asp-action="Login" asp-route-returnUrl="@baseUri.AbsolutePath">

Як отримати доступ до контексту на сторінці бритви, як це було показано у цьому прикладі? Я додав код, але контекст не визначений.
ZedZip

Я отримую це від класу WebViewPage System.Web.Mvc
Intesar Alam

7
using Microsoft.AspNetCore.Server.Kestrel.Internal.Http;

var referer = ((FrameRequestHeaders)Request.Headers).HeaderReferer.FirstOrDefault();

майже так само, як прийнята відповідь без чарівної струни


Але чи потрібен Nugetпакет ( Microsoft.AspNetCore.Server.Kestrel) ... також чи перевірено це для роботи IISExpress? SSL? тощо?
Serj Sagan

1
На мою думку, @SerjSagan впевненість у коді, що забезпечується безпекою типу (на відміну від магічних рядків для інших рішень), переважно переважає додатковий обсяг, що стосується хостингу, оскільки він покладається на пустелю, вона повинна працювати у всіх режимах хостингу. SSL не тестували, але він не повинен мати різниці
Сухайб Бесбес

0

Це працює (перевірено в .NET Core 3.1):

Request.GetTypedHeaders().Referer

Requestє властивістю обох BaseControllerі HttpContext, тому ви можете отримати його з будь-якого.

Наприклад, щоб перенаправити на сторінку переходу з дії контролера, просто виконайте наступне:

public IActionResult SomeAction()
{
    return Redirect(Request.GetTypedHeaders().Referer.ToString());
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.