Bagaimana saya bisa mendapatkan Perujuk Url di ASP.NET Core MVC?


99

Saya mencoba untuk memigrasi formulir web ASP.NET MVC ke ASP.NET Core MVC. Saat ini, saya mengalami masalah dengan Request.UrlReferrerkelas.

Baris aslinya adalah:

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

Namun, dengan ASP.NET Core, UrlReferrer tidak tersedia. Saya telah menemukan yang berikut ini:

    Request.Headers["Referer"]

yang mengembalikan StringValues, bukan String. Saya tidak yakin apakah saya harus mencoba menggunakan yang ini atau jika ada solusi lain untuk situasi ini. Request.ServerVariablesjuga tidak tersedia atau mungkin saya tidak memiliki namespace. Ruang nama saya adalah sebagai berikut:

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

Saya akan sangat menghargai jika seseorang dapat mengarahkan saya ke arah yang benar.


1
Beberapa situs seperti Google tidak akan memberi Anda perujuk karena alasan keamanan. Dari mata Google: Google tidak ingin Anda melihat teks pencarian yang akan menjadi bagian dari referer.
Benjamin Abt

FYI: Perujuk URL tidak dapat diandalkan.
Menangkan

Jawaban:


154

Kamu hampir sampai. The StringValueskelas hanya jenis penggunaan ASP.NET untuk secara efisien mewakili string dalam rangka. Terutama pada HttpContextobyeknya. Anda bisa memanggilnya ToString()untuk mengubahnya menjadi string:

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

1
Apakah Anda menganggap ini sebagai cara yang dapat diandalkan untuk melakukannya? Apakah ada cara alternatif?
Kemal Tezer Dilsiz

4
Ini dapat diandalkan dalam hal mengakses properti dari header permintaan yang dikirim oleh klien. Namun, saya tidak akan menganggap nilai tajuk perujuk yang dikirim oleh klien dapat diandalkan karena sangat mudah marah.
Henk Mollema

70
Bagi mereka yang penasaran apakah Referer salah eja di jawaban, sebenarnya tidak. Meskipun Pengarah adalah ejaan yang benar, mereka membuat kesalahan ejaan dalam spesifikasi HTTP english.stackexchange.com/questions/42630/referer-or-referrer/…
Frank

1
Anda dapat menemukan semua yang berhubungan dengan migrasi penangan HTTP dan modul ke ASP.net Core di: docs.microsoft.com/en-us/aspnet/core/migration/http-modules
AlexGH

1
@FrankRem Simpul bahwa Aye'm ah speling geenious, tapi itu cukup lucu. Apakah pelakunya yang salah eja telah ditemukan?
Michael Tranchida


9

Inilah cara saya mendapatkan pengarah url: -

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


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

Bagaimana cara mengakses Konteks di halaman pisau cukur seperti yang Anda tunjukkan dalam contoh itu? Saya telah menambahkan kode tetapi Konteks tidak ditentukan.
ZedZip

Saya mendapatkannya dari kelas WebViewPage System.Web.Mvc
Intesar Alam

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

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

hampir sama dengan jawaban yang diterima tanpa benang ajaib


Tetapi apakah memerlukan Nugetpaket ( Microsoft.AspNetCore.Server.Kestrel) ... apakah ini juga telah diuji untuk berfungsi IISExpress? SSL? dll.?
Serj Sagan

1
@SerjSagan menurut pendapat saya kode cofidence yang disediakan oleh jenis keamanan (sebagai lawan dari string ajaib untuk solusi lain) sebagian besar lebih besar daripada nuget tambahan, seperti untuk hosting, karena bergantung pada kestrel itu harus bekerja di semua mode hosting. SSL tidak diuji tetapi seharusnya tidak membuat perbedaan
Souhaieb Besbes

1

Ini berfungsi (diuji di .NET Core 3.1):

Request.GetTypedHeaders().Referer

Requestadalah properti dari keduanya ControllerBase(dan karenanya Controllerjuga) dan HttpContext, jadi Anda bisa mendapatkannya dari keduanya.

Misalnya, untuk mengalihkan ke halaman rujukan dari tindakan pengontrol, cukup lakukan ini:

public IActionResult SomeAction()
{
    return Redirect(Request.GetTypedHeaders().Referer.ToString());
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.