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