ASP.NET Core MVC'de URL Yönlendiricisini nasıl edinebilirim?


99

ASP.NET MVC web formunu ASP.NET Core MVC'ye geçirmeye çalışıyorum. Şu anda Request.UrlReferrersınıfla ilgili sorun yaşıyorum .

Orijinal satır:

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

Ancak, ASP.NET Core ile UrlReferrer kullanılamaz. Aşağıdakileri buldum:

    Request.Headers["Referer"]

bir String yerine StringValues ​​döndürür. Bunu kullanmaya çalışmam gerekip gerekmediğinden veya bu duruma başka çözümler olup olmadığından emin değilim. Request.ServerVariablesda mevcut değil veya belki ad alanım yok. Ad alanlarım aşağıdaki gibidir:

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

Biri beni doğru yöne yönlendirebilirse gerçekten minnettar olurum.


1
Google gibi bazı siteler, güvenlik nedeniyle size referans vermez. Google gözlerinden: Google, yönlendirenin bir parçası olacak arama metnini görmenizi istemez.
Benjamin Abt

Bilginize: URL Yönlendiricisi güvenilir değil.
kazan

Yanıtlar:


155

Neredeyse oradasın. StringValuesSınıf sadece bir tip ASP.NET kullandığı verimli çerçevesinde dizeleri temsil etmektir. Özellikle HttpContextnesnede. Onu ToString()bir dizeye dönüştürmek için çağırabilirsiniz :

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

1
Bunu yapmanın güvenilir bir yolu olduğunu düşünüyor musunuz? Alternatif yollar var mı?
Kemal Tezer Dilsiz

4
İstemci tarafından gönderilen istek başlıklarından mülke erişim açısından güvenilirdir. Bununla birlikte, düzeltilmesi çok kolay olduğu için müşteri tarafından gönderilen yönlendirme başlığının değerini güvenilir olarak düşünmem .
Henk Mollema

70
Referer'ın cevapta yanlış yazılıp yazılmadığını merak edenler için değil. Yönlendiren doğru yazım olmasına rağmen, HTTP spesifikasyonunda yazım hatası yaptı english.stackexchange.com/questions/42630/referer-or-referrer/…
Frank

1
HTTP işleyicileri ve modüllerinin ASP.net Core'a geçişleriyle ilgili tüm bilgileri şurada bulabilirsiniz
AlexGH

1
@FrankRem Knot, Aye'm hecelediğimi, ama bu oldukça komik. Yanlış heceleyen suçlu ortaya çıktı mı?
Michael Tranchida


9

İşte url yönlendiricisini şu şekilde buldum: -

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


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

Bu örnekte gösterildiği gibi jilet sayfasındaki Bağlam'a nasıl erişilir? Kodu ekledim ama Bağlam tanımsız.
ZedZip

System.Web.Mvc'nin WebViewPage sınıfından alıyorum
Intesar Alam

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

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

sihirli ip olmadan kabul edilen cevapla neredeyse aynı


Ama bir Nugetpaket gerektiriyor ( Microsoft.AspNetCore.Server.Kestrel) ... bunun da çalışması için test edildi IISExpressmi? SSL? vb.?
Serj Sagan

1
@SerjSagan benim görüşüme göre, tür güvenliği tarafından sağlanan kod katsayısı (diğer çözümler için sihirli dizelere karşılık olarak), kerkenez'e dayandığından, tüm barındırma modlarında çalışması gerektiğinden, barındırmada olduğu gibi, ek nugetten büyük ölçüde ağır basmaktadır. SSL test edilmedi, ancak bir fark
yaratmamalı

1

Bu çalışır (.NET Core 3.1'de test edilmiştir):

Request.GetTypedHeaders().Referer

Requesther ikisinin de ControllerBase(ve dolayısıyla Controllerda) bir özelliğidir ve böylece her ikisinden HttpContextde alabilirsiniz.

Örneğin, bir denetleyici eyleminden yönlendiren sayfaya yeniden yönlendirmek için şunu yapın:

public IActionResult SomeAction()
{
    return Redirect(Request.GetTypedHeaders().Referer.ToString());
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.