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