Kemal Tezer Dilsiz
Kemal Tezer Dilsiz

Reputation: 4009

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.

Upvotes: 152

Views: 116951

Answers (6)

Nick B
Nick B

Reputation: 715

In ASP.NET Core MVC, you can get the URL referrer from the Referer header in the HTTP request. You can access this in your controller by looking at the HttpContext.Request.Headers collection

Example:

if (Request.Headers.TryGetValue(HeaderNames.Referer, out var referer))
{
  ...
}

Also, make sure to check if the referrer is empty.

Upvotes: 1

Eric Herlitz
Eric Herlitz

Reputation: 26267

As of asp.net core 2 use GetTypedHeaders

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

Update 2024

Since IHttpContextAccessor is more common to use the request object can be obtained like this

Inject IHttpContextAccessor as _httpContextAccessor

Fetch the referrer Uri with

private Uri GetReferrer()
{
    var header = _httpContextAccessor.HttpContext.Request.GetTypedHeaders();
    return header.Referer;
}

Upvotes: 84

MarredCheese
MarredCheese

Reputation: 20791

This works (tested in .NET Core 3.1 onward):

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());
}

Update:

Made an extension method:

using Microsoft.AspNetCore.Http;

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

Usage:

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

Upvotes: 35

Intesar Alam
Intesar Alam

Reputation: 161

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">

Upvotes: 12

Souhaieb Besbes
Souhaieb Besbes

Reputation: 1505

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

Upvotes: 8

Henk Mollema
Henk Mollema

Reputation: 46531

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();

Upvotes: 226

Related Questions