加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-core-mvc – 如何从任何ASP .Net Core类访问当前的绝对U

发布时间:2020-12-16 04:01:00 所属栏目:asp.Net 来源:网络整理
导读:我试图弄清楚如何从.Net Core 1.1中的用户类访问当前的绝对Uri – 即当前正在呈现的视图的绝对URL 我发现了这个链接,但它似乎已经过时并在错误后抛出错误:Getting absolute URLs using ASP.NET Core MVC 6 在我的Startup.cs中,我在ConfigureServices下: se
我试图弄清楚如何从.Net Core 1.1中的用户类访问当前的绝对Uri – 即当前正在呈现的视图的绝对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);

我有以下课程:

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:WebsitesStagewwwExtensionsContext.cs:line 16
at Framework.Extensions.Context..cctor() in E:WebsitesStagewwwExtensionsContext.cs:line 18
InnerException:

解决方法

您希望在启动时“配置或注入”IHttpContextAccessor,以便稍后在请求的上下文中使用帮助程序时,可以使用它来访问当前的HttpContext对象.

您无法将上下文存储在静态字段中,因为该上下文仅在提供特定请求时才有意义.通常,您将把访问器保留在静态字段中,并在每次调用助手时使用它.

>更糟糕的是,您使用带有初始化程序的静态字段,这些字段在第一次使用该类时执行.这意味着它们在您调用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() { }
}

还有一件事要记住:

>在最初的问题中,帮助程序是作为静态类创建的,因为它们是作为扩展方法创建的.如果您不使用扩展方法,则不必强制使用静态类.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读