Estoy tratando de averiguar cómo acceder a la actual Uri absoluto, es decir, la url absoluta de la opinión de que está siendo representado, desde una clase de usuario .Net Core 1.1

He encontrado este enlace, pero parece ser anticuado y tira error tras error: Obtención de direcciones Url absolutas en el uso de ASP.NET Núcleo MVC 6


En mi Inicio.cs que tengo ConfigureServices:

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

En mi Inicio.cs tengo en Configurar:

IHttpContextAccessor httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
Extensions.Context.Configure(httpContextAccessor);

Tengo la siguiente clase:

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;
    }
}

Me sale el siguiente excepción:

Sistema.TypeInitializationException fue controlada por el código de usuario
HResult=-2146233036 Mensaje=El inicializador de tipo
‘Marco.Las extensiones.Contexto’ lanzó una excepción.
TypeName=Marco.Las extensiones.Contexto InnerException:
HResult=-2147467261
Mensaje=referencia a Objeto no establecida como instancia de un objeto.
Source=www
StackTrace:
en el Marco.Las extensiones.Contexto.GetCurrentContext() en E:\Websites\Stage\www\Extensions\Context.cs:line 16
en el Marco.Las extensiones.Contexto..cctor() en E:\Websites\Stage\www\Extensions\Context.cs:line 18
InnerException:

Esto funciona. El error que estás recibiendo?
He añadido mi código y el error actual de ser lanzado.
Usted no puede tener una propiedad estática Current! Eso significaría que usted utilice siempre el mismo contexto, pero si quieres que por solicitud, y, por supuesto, usted puede utilizar en su inicializador como no hay ninguna solicitud en el momento en que la clase se inicializa. Sólo mantener la IHttpContextAccessor en la estática de la proposición, a continuación, recuperar el contexto actual en el interior de GetAbsoluteUri
He probado la eliminación de la estática Contexto de la propiedad y el acceso al contexto actual en el interior de la GetAbsoluteUri() método, pero me sale «referencia a Objeto no establecida como instancia de un objeto» en la siguiente línea dentro de la GetAbsoluteUri() método: HttpContext current = HttpContextAccessor.HttpContext;
stackoverflow.com/questions/4660142/… – asegúrese de que el HttpContextAccessor no es nulo, puesto que se han establecido en el método Configure () que llama en su inicio

OriginalEl autor eat-sleep-code | 2017-03-02

3 Comentarios

  1. 9

    Desea que el IHttpContextAccessor «configurado o se inyecta» en su Startup así, más adelante cuando se utiliza el helper en el contexto de una solicitud que usted puede utilizar para acceder a la actual HttpContext objeto.

    No puede almacenar el contexto de un campo estático como el contexto sólo tiene sentido al servicio de una solicitud específica. Normalmente, tendrá que abandonar el descriptor de acceso en un campo estático y usarlo cada vez que su ayudante se llama.

    • Incluso peor que usted está usando los campos estáticos con inicializadores, el cual se ejecuta la primera vez que se usa la clase. Que significa que se ejecuta justo antes de llamar al método Configure (), por lo que no será IHttpContextAccessor ha configurado y obtendrá las referencias nulas.

    Esto sería una cosa simple de escribir lo que usted quiere:

    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() { }
    }
    

    Una cosa más a tener en cuenta:

    • En la pregunta original, el ayudante fue creado como una clase estática porque fueron creados como los métodos de extensión. Si usted no está utilizando los métodos de extensión no está obligado a usar una clase estática.
    Una salvedad a esto: usted debería considerar también el puerto, por lo que funciona en dev entornos (es decir localhost:1234). si (solicitud.Host.Puerto.HasValue && petición.Host.Puerto != 80 && petición.Host.Puerto != 443) uriBuilder.Puerto = solicitud.Host.Puerto.Valor;
    No var request = HttpContextAccessor.HttpContext.Request; tirar un error .. null ?

    OriginalEl autor Daniel J.G.

  2. 18

    Usted puede utilizar el GetDisplayUrl método de extensión.

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

    Suponiendo httpContextAccessor es un objeto de IHttpContextAccessor que se inyecta a través de DI.

    Este método de extensión se define en Microsoft.AspNetCore.Http.Extensions espacio de nombres. Por lo que debe tener una instrucción para incluir en su archivo.

    using Microsoft.AspNetCore.Http.Extensions;

    null para mí, donde el uso de este para obtener una url ? :/
    Oh, en realidad, que funciona bien en el Controlador .net core, yo quería el acceso desde el inicio.cs … como estoy migrando «legado» .net .net core y la accesibilidad es mucho mejor

    OriginalEl autor Shyju

Dejar respuesta

Please enter your comment!
Please enter your name here