我试图找出如何从.Net Core 1.1中的用户类访问当前绝对Uri-即当前正在呈现的 View 的绝对URL
我找到了此链接,但它似乎已过时,并在错误后引发错误:Getting absolute URLs using ASP.NET Core MVC 6
在我的Startup.cs中,在ConfigureServices下:
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
在我的Startup.cs中,在“配置”下:
IHttpContextAccessor httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
Extensions.Context.Configure(httpContextAccessor);
我有以下类(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;
}
}
我得到以下异常:
最佳答案
您希望在IHttpContextAccessor
中“配置或注入(inject)” Startup
,以便稍后在请求上下文中使用帮助器时,可以使用它来访问当前的HttpContext
对象。
您不能将上下文存储在静态字段中,因为该上下文仅在满足特定请求时才有意义。通常,您将访问器保留在静态字段中,并在每次调用助手时使用它。
IHttpContextAccessor
进行配置,并且您将获得这些空引用。 这将是编写所需内容的简单操作:
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() { }
}
还有一点要牢记: