如何从任何ASP .Net Core类访问当前的绝对Uri?

eat*_*ode 13 asp.net-core-mvc

我试图弄清楚如何从.Net Core 1.1中的用户类访问当前的绝对Uri - 即当前正在呈现的视图的绝对URL

我找到了这个链接,但它似乎已经过时并在出错后抛出错误:使用ASP.NET Core MVC 6获取绝对URL


在我的Startup.cs中,我在ConfigureServices下:

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
Run Code Online (Sandbox Code Playgroud)

在我的Startup.cs中我有配置:

IHttpContextAccessor httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
Extensions.Context.Configure(httpContextAccessor);
Run Code Online (Sandbox Code Playgroud)

我有以下课程:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到以下异常:

System.TypeInitializationException未被用户代码处理
HResult = -2146233036 Message ='Framework.Extensions.Context'的类型初始值设定项引发异常.
TypeName = Framework.Extensions.Context InnerException:HResult = -2147467261 Message =对象引用未设置为对象的实例.Source = www StackTrace:位于E:\ Websites\Stage\www\Extensions\Context.cs中的Framework.Extensions.Context.GetCurrentContext():E:\ Websites \中Framework.Extensions.Context..cctor()的第16行Stage\www\Extensions\Context.cs:第18行InnerException:

Shy*_*yju 20

您可以使用GetDisplayUrl扩展方法.

var url = httpContextAccessor.HttpContext?.Request?.GetDisplayUrl();
Run Code Online (Sandbox Code Playgroud)

假设httpContextAccessorIHttpContextAccessor通过DI注入的对象.

此扩展方法在Microsoft.AspNetCore.Http.Extensions命名空间中定义.因此,您需要使用using语句将其包含在文件中.

using Microsoft.AspNetCore.Http.Extensions;


Dan*_*.G. 15

你想要的IHttpContextAccessor"配置或注入"你Startup这样以后当你可以用它来访问当前请求的上下文中使用助手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() { }
}
Run Code Online (Sandbox Code Playgroud)

还有一件事要记住:

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

  • 有一点需要注意:您还应该考虑端口,以便它在开发环境中工作(即localhost:1234).if(request.Host.Port.HasValue && request.Host.Port!= 80 && request.Host.Port!= 443)uriBuilder.Port = request.Host.Port.Value; (2认同)