ChatGPT解决这个技术问题 Extra ChatGPT

How can I get Url Referrer in ASP.NET Core MVC?

I am trying to migrate an ASP.NET MVC webform to ASP.NET Core MVC. Currently, I am having trouble with the Request.UrlReferrer class.

The original line is:

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

However, with ASP.NET Core, UrlReferrer is not available. I have found the following:

    Request.Headers["Referer"]

which returns StringValues instead of a String. I am not sure if I should try to use this one or if there is any other solutions to this situation. Request.ServerVariables is also not available or maybe I don't have the namespace. My namespaces are as follows:

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

I would really appreciate if someone can direct me in the right direction.

Some sites like Google wont give you the referer for security reasons. From Google eyes: Google do not want that you'll see the search text which would be a part of the referer.
FYI: URL Referer is not reliable.

H
Henk Mollema

You're almost there. The StringValues class is just a type ASP.NET uses to efficiently represent strings in the framework. Especially in the HttpContext object. You can just call ToString() on it to convert it to a string:

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

Would you consider this to be a reliable way of doing it? Are there any alternative ways?
It is reliable in terms of accessing the property from the request headers being sent by the client. However, I wouldn't consider the value of the referrer header being send by the client reliable since it's very easy to temper.
For those who are curious if Referer is misspelled in the anwer, it is not. Although Referrer is the correct spelling, they made the misspelling in the HTTP specification english.stackexchange.com/questions/42630/referer-or-referrer/…
You can find all concerning to migrations of HTTP handlers and modules to ASP.net Core in : docs.microsoft.com/en-us/aspnet/core/migration/http-modules
@FrankRem Knot that Aye'm ah speling geenious, but that's pretty funny. Has the culprit who misspelled it been ferreted out?
E
Eric Herlitz

As of asp.net core 2 use GetTypedHeaders

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

This must have been removed in 3
Should still be in 3 @Snipe3000 docs.microsoft.com/en-us/dotnet/api/…
Still there but you need to include using Microsoft.AspNetCore.Http; to get the extension method.
I like this answer because referrer here is a Uri object not a string, which is more handy to work with
M
MarredCheese

This works (tested in .NET Core 3.1):

Request.GetTypedHeaders().Referer

Request is a property of both ControllerBase (and therefore Controller too) and HttpContext, so you can get it from either.

For example, to redirect to the referring page from a controller action, just do this:

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

FYI you need to add the namespace for this - using Microsoft.AspNetCore.Http;
I
Intesar Alam

Here is how I got url referrer:-

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


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

How to access Context in razor page as you did show in that example? I have added the code but Context is undefined.
I'm getting it from WebViewPage class of System.Web.Mvc
S
Shamshiel
using Microsoft.AspNetCore.Server.Kestrel.Internal.Http;

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

almost the same as the accepted answer without the magic string


But does require a Nuget package (Microsoft.AspNetCore.Server.Kestrel)... also has this been tested to work in IISExpress? SSL? etc.?
@SerjSagan in my oppinion the code cofidence provided by type safety (as aopposed to magic strings for the other solutions) largely outweighs the additional nuget, as for hosting, since it relies on kestrel it should work in all hosting modes. SSL was not tested but it should not make a difference