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

时间:2017-03-02 05:40:57

标签: asp.net-core-mvc

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

我找到了这个链接,但似乎已经过时并在出错后抛出错误:Getting absolute URLs using ASP.NET Core MVC 6

在我的Startup.cs中,我有 ConfigureServices

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

在我的Startup.cs中,我在Configure:

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未被用户代码
处理   HResult = -2146233036 Message =类型初始值设定项   &#39; Framework.Extensions.Context&#39;抛出异常。
  TypeName = Framework.Extensions.Context InnerException:          的HResult = -2147467261          Message =对象引用未设置为对象的实例。          来源= WWW          堆栈跟踪:               在E:\ Websites \ Stage \ www \ Extensions \ Context.cs中的Framework.Extensions.Context.GetCurrentContext():第16行               在E:\ Websites \ Stage \ www \ Extensions \ Context.cs中的Framework.Extensions.Context..cctor():第18行          的InnerException:

3 个答案:

答案 0 :(得分:18)

您可以使用GetDisplayUrl扩展方法。

var url = httpContextAccessor.HttpContext?.Request?.GetDisplayUrl();

假设httpContextAccessorIHttpContextAccessor的对象,它是通过DI注入的。

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

using Microsoft.AspNetCore.Http.Extensions;

答案 1 :(得分:9)

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

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

  • 更糟糕的是,您正在使用带有初始化程序的静态字段,这些字段在第一次使用该类时执行。这意味着它们在您调用Configure方法之前就已执行,因此尚未配置HttpContext,您将获得这些空引用。

写下你想要的东西很简单:

IHttpContextAccessor

还要记住一件事:

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

答案 2 :(得分:-2)

我在api上使用它

using Microsoft.AspnetCore.Http.Hoststring

var uri = Request.Host;