I am trying to figure out how to access the current absolute Uri -- i.e. the absolute url of the view that is currently being rendered -- from a user class in .Net Core 1.1
I found this link but it seems to be outdated and throws error after error: Getting absolute URLs using ASP.NET Core MVC 6
In my Startup.cs I have under ConfigureServices:
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
In my Startup.cs I have under Configure:
IHttpContextAccessor httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
Extensions.Context.Configure(httpContextAccessor);
I have the following class:
using Microsoft.AspNetCore.Http;
using System;
namespace Framework.Extensions
{
public static class Context
{
private static IHttpContextAccessor HttpContextAccessor;
public static void Configure(IHttpContextAccessor httpContextAccessor)
{
HttpContextAccessor = httpContextAccessor;
}
private static HttpContext GetCurrentContext()
{
return HttpContextAccessor.HttpContext;
}
public static HttpContext Current = GetCurrentContext();
private static Uri GetAbsoluteUri()
{
UriBuilder uriBuilder = new UriBuilder();
uriBuilder.Scheme = GetCurrentContext().Request.Scheme;
uriBuilder.Host = GetCurrentContext().Request.Host.ToString();
uriBuilder.Path = GetCurrentContext().Request.Path.ToString();
uriBuilder.Query = GetCurrentContext().Request.QueryString.ToString();
return uriBuilder.Uri;
}
public static Uri AbsoluteUri = GetAbsoluteUri();
public static string Url = GetAbsoluteUri().ToString();
public static string AbsolutePath = GetAbsoluteUri().AbsolutePath;
}
}
I get the following exception:
System.TypeInitializationException was unhandled by user code
HResult=-2146233036 Message=The type initializer for 'Framework.Extensions.Context' threw an exception.
TypeName=Framework.Extensions.Context InnerException: HResult=-2147467261 Message=Object reference not set to an instance of an object. Source=www StackTrace: at Framework.Extensions.Context.GetCurrentContext() in E:\Websites\Stage\www\Extensions\Context.cs:line 16 at Framework.Extensions.Context..cctor() in E:\Websites\Stage\www\Extensions\Context.cs:line 18 InnerException:
Url. AbsoluteUri is returning "http://www.somesite.com/default.aspx" , when the Url in the client's browser looks like "http://www.somesite.com/". This small diffrence is causing a redirect loop.
The HttpContext object constructed by the ASP.NET Core web server acts as a container for a single request. It stores the request and response information, such as the properties of request, request-related services, and any data to/from the request or errors, if there are any.
You may use the GetDisplayUrl
extension method.
var url = httpContextAccessor.HttpContext?.Request?.GetDisplayUrl();
Assuming httpContextAccessor
is an object of IHttpContextAccessor
which was injected via DI.
This extension method is defined in Microsoft.AspNetCore.Http.Extensions
namespace. So you need to have a using statement to include it in your file.
using Microsoft.AspNetCore.Http.Extensions;
You want the IHttpContextAccessor
"configured or injected" in your Startup
so later on when you use the helper during the context of a request you can use it to access the current HttpContext
object.
You cannot store the context on a static field as that context only makes sense while serving a specific request. Typically you will leave the accessor in a static field and use it every time your helper is called.
IHttpContextAccessor
yet configured and you will get those null references.This would be a simple thing of writing what you want:
public static class Context
{
private static IHttpContextAccessor HttpContextAccessor;
public static void Configure(IHttpContextAccessor httpContextAccessor)
{
HttpContextAccessor = httpContextAccessor;
}
private static Uri GetAbsoluteUri()
{
var request = HttpContextAccessor.HttpContext.Request;
UriBuilder uriBuilder = new UriBuilder();
uriBuilder.Scheme = request.Scheme;
uriBuilder.Host = request.Host.Host;
uriBuilder.Path = request.Path.ToString();
uriBuilder.Query = request.QueryString.ToString();
return uriBuilder.Uri;
}
// Similar methods for Url/AbsolutePath which internally call GetAbsoluteUri
public static string GetAbsoluteUrl() { }
public static string GetAbsolutePath() { }
}
One more thing to bear in mind:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With