如何在 ASP.NET Core MVC 中获取 Url Referrer?
Posted
技术标签:
【中文标题】如何在 ASP.NET Core MVC 中获取 Url Referrer?【英文标题】:How can I get Url Referrer in ASP.NET Core MVC? 【发布时间】:2016-08-04 16:08:21 【问题描述】:我正在尝试将 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;
如果有人能指引我正确的方向,我将不胜感激。
【问题讨论】:
出于安全原因,某些网站(如 Google)不会为您提供推荐人。从 Google 的角度来看:Google 不希望您看到作为引荐来源的搜索文本。 仅供参考:URL Referer 不可靠。 【参考方案1】:你快到了。 StringValues
类只是 ASP.NET 用来在框架中有效表示字符串的一种类型。特别是在HttpContext
对象中。你可以直接调用 ToString()
将其转换为字符串:
string referer = Request.Headers["Referer"].ToString();
【讨论】:
您认为这是一种可靠的方法吗?有没有其他方法? 从客户端发送的请求头中访问属性是可靠的。但是,我不认为客户端发送的引用标头的 value 是可靠的,因为它很容易调整。 对于那些好奇Referer是否在anwer中拼写错误的人来说,不是。虽然 Referrer 是正确的拼写,但他们在 HTTP 规范english.stackexchange.com/questions/42630/referer-or-referrer/… 中拼写错误 您可以在docs.microsoft.com/en-us/aspnet/core/migration/http-modules 中找到所有有关将 HTTP 处理程序和模块迁移到 ASP.net Core 的信息 @FrankRem Knot that Aye'm ah speling geenious,但这很有趣。拼错的罪魁祸首已经被查出来了吗?【参考方案2】:从 asp.net core 2 开始使用 GetTypedHeaders
RequestHeaders header = request.GetTypedHeaders();
Uri uriReferer = header.Referer;
【讨论】:
这必须在 3 中删除 应该还在 3 @Snipe3000 docs.microsoft.com/en-us/dotnet/api/… 仍然存在,但您需要包含using Microsoft.AspNetCore.Http;
以获取扩展方法。
我喜欢这个答案,因为这里的引用者是一个 Uri 对象而不是字符串,使用起来更方便【参考方案3】:
这可行(在 .NET Core 3.1 中测试):
Request.GetTypedHeaders().Referer
Request
是 ControllerBase
(因此也是 Controller
)和 HttpContext
的属性,因此您可以从其中任何一个中获取它。
例如,要从控制器操作重定向到引用页面,只需执行以下操作:
public IActionResult SomeAction()
return Redirect(Request.GetTypedHeaders().Referer.ToString());
【讨论】:
仅供参考,您需要为此添加命名空间 -using Microsoft.AspNetCore.Http;
【参考方案4】:
这是我获得 url referrer 的方式:-
@
string referer = Context.Request.Headers["Referer"].ToString();
Uri baseUri = new Uri(referer);
<form asp-action="Login" asp-route-returnUrl="@baseUri.AbsolutePath">
【讨论】:
如何访问剃刀页面中的上下文,如您在该示例中所示?我已添加代码,但上下文未定义。 我是从 System.Web.Mvc 的 WebViewPage 类中获取的【参考方案5】:using Microsoft.AspNetCore.Server.Kestrel.Internal.Http;
var referer = ((FrameRequestHeaders)Request.Headers).HeaderReferer.FirstOrDefault();
几乎与没有魔法字符串的接受答案相同
【讨论】:
但确实需要Nuget
包 (Microsoft.AspNetCore.Server.Kestrel
)... 是否也已经过测试可以在 IISExpress
中使用? SSL
?等等?
@SerjSagan 在我看来,类型安全提供的代码一致性(与其他解决方案的魔术字符串相反)在很大程度上超过了额外的 nuget,因为它依赖于它应该工作的红隼所有托管模式。 SSL 没有经过测试,但应该不会有什么不同以上是关于如何在 ASP.NET Core MVC 中获取 Url Referrer?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Asp.net core mvc 的控制器中获取自己的用户
如何使用 ASP.NET Core RC2 MVC6 和 IIS7 获取当前 Windows 用户
如何从 HttpContext 获取 ASP.NET Core MVC 过滤器
如何使用 C# 在 ASP.NET Core 3.1 MVC 中使用会话变量