如何在ASP.NET Core MVC中获取Url Referrer?

Kem*_*siz 72 c# asp.net-core-mvc asp.net-core

我正在尝试将ASP.NET MVC webform迁移到ASP.NET Core MVC.目前,我在Request.UrlReferrer上课时遇到了麻烦.

原来的行是:

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

但是,使用ASP.NET Core时,UrlReferrer不可用.我发现了以下内容:

    Request.Headers["Referer"]
Run Code Online (Sandbox Code Playgroud)

返回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;
Run Code Online (Sandbox Code Playgroud)

如果有人能指引我朝着正确的方向前进,我真的很感激.

Hen*_*ema 120

你快到了.本StringValues类只是一个类型ASP.NET使用高效地表示在框架中的字符串.特别是在HttpContext对象中.您可以调用ToString()它将其转换为字符串:

string referer = Request.Headers["Referer"].ToString();
Run Code Online (Sandbox Code Playgroud)

  • 如果那些好奇的人如果Referer在anwer中拼错了,那就不是了.尽管Referrer是正确的拼写,但他们在HTTP规范中进行了拼写错误https://english.stackexchange.com/questions/42630/referer-or-referrer/42636 (46认同)
  • 在从客户端发送的请求标头访问属性方面,它是可靠的.但是,我不认为客户端发送的referrer标头的_value_是可靠的,因为它很容易发脾气. (2认同)

Mar*_*ese 15

这有效(在 .NET Core 3.1 中测试):

Request.GetTypedHeaders().Referer
Run Code Online (Sandbox Code Playgroud)

Request是两者ControllerBase(因此Controller也是) and的属性HttpContext,因此您可以从其中任何一个获取它。

例如,要从控制器操作重定向到引用页面,只需执行以下操作:

public IActionResult SomeAction()
{
    return Redirect(Request.GetTypedHeaders().Referer.ToString());
}
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,您需要为此添加命名空间 - `using Microsoft.AspNetCore.Http;` (2认同)

Eri*_*itz 11

从asp.net core 2开始使用 GetTypedHeaders

RequestHeaders header = request.GetTypedHeaders();
Uri uriReferer = header.Referer;
Run Code Online (Sandbox Code Playgroud)

  • 应该仍然在 3 @Snipe3000 https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.http.headerdictionarytypeextensions.gettypedheaders?view=aspnetcore-3.1 (4认同)
  • 仍然存在,但您需要包含“using Microsoft.AspNetCore.Http;”才能获取扩展方法。 (2认同)
  • 我喜欢这个答案,因为这里的引用者是一个 Uri 对象而不是字符串,使用起来更方便 (2认同)

Sou*_*bes 7

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

var referer = ((FrameRequestHeaders)Request.Headers).HeaderReferer.FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

几乎与没有魔法字符串的接受答案相同


小智 7

这是我如何获得网址引荐来源网址的方法:-

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


<form asp-action="Login" asp-route-returnUrl="@baseUri.AbsolutePath">
Run Code Online (Sandbox Code Playgroud)