我发现了这个链接,但它似乎已经过时并在错误后抛出错误: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);
我有以下课程:
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; } }
我得到以下异常:
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:
解决方法
您无法将上下文存储在静态字段中,因为该上下文仅在提供特定请求时才有意义.通常,您将把访问器保留在静态字段中,并在每次调用助手时使用它.
>更糟糕的是,您使用带有初始化程序的静态字段,这些字段在第一次使用该类时执行.这意味着它们在您调用Configure方法之前执行,因此将不会配置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() { } }
还有一件事要记住:
>在最初的问题中,帮助程序是作为静态类创建的,因为它们是作为扩展方法创建的.如果您不使用扩展方法,则不必强制使用静态类.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。