如何在 ASP.NET 核心 MVC 中获得 Url 引用?

我正在尝试将一个 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"]

它返回 StringValue 而不是 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;

如果有人能给我指明正确的方向,我将不胜感激。

94811 次浏览

你就快到了。StringValues类只是 ASP.NET 用来在框架中有效地表示字符串的一种类型。特别是在 HttpContext对象中。你可以调用 ToString()把它转换成字符串:

string referer = Request.Headers["Referer"].ToString();
using Microsoft.AspNetCore.Server.Kestrel.Internal.Http;


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

几乎和没有魔绳的答案一样

下面是我如何得到网址参考:-

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




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

从 asp.net 核心2开始,使用 GetTypedHeaders

RequestHeaders header = request.GetTypedHeaders();
Uri uriReferer = header.Referer;

这可以工作(在.NET Core 3.1之后进行测试) :

Request.GetTypedHeaders().Referer

RequestControllerBase(因此也是 Controller)和 HttpContext的属性,所以您可以从两者中的任何一个获得它。例如,要从控制器操作重定向到引用页面,只需执行以下操作:

public IActionResult SomeAction()
{
return Redirect(Request.GetTypedHeaders().Referer.ToString());
}

更新:

制定了一个扩展方法:

using Microsoft.AspNetCore.Http;


public static class RequestExtensions
{
public static string GetReferrer(this HttpRequest request)
{
return request.GetTypedHeaders().Referer.ToString();
}
}

用法:

public IActionResult SomeAction()
{
return Redirect(Request.GetReferrer());
}