web-dev-qa-db-fra.com

Comment puis-je obtenir le baseurl de mon site dans ASP.NET Core?

Supposons que mon site Web soit hébergé dans le dossier mon site Web de www.example.com et je visite https://www.example.com/mywebsite/home/about .

Comment obtenir la partie base de l'URL dans un contrôleur MVC? La partie que je cherche est https://www.example.com/mywebsite

L'exemple indiqué ici ne fonctionne pas car nous n'avons pas accès à Request.Url dans ASP.NET Core.

33
jao

Vous devriez toujours pouvoir rassembler ce dont vous avez besoin. Vous avez accès à l'objet de requête si votre contrôleur hérite de Controller.

Si vous utilisez VS2017, lancez une nouvelle application ASPNet Core MVC et remplacez le homecontroller par:

public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View();
    }

    public IActionResult About()
    {
        ViewData["Message"] = $"{this.Request.Scheme}://{this.Request.Host}{this.Request.PathBase}";

        return View();
    }

    public IActionResult Contact()
    {
        ViewData["Message"] = "Your contact page.";

        return View();
    }

    public IActionResult Error()
    {
        return View();
    }
}

Je viens d’inscrire certaines des choses qui pourraient vous intéresser dans la méthode "À propos de", mais vous devriez explorer le reste de la classe de requêtes pour savoir quelles autres options sont disponibles.

Comme @Tseng l'a fait remarquer, vous pourriez avoir un problème lorsque vous exécutez Kestrel derrière IIS ou Azure App Service, mais si vous utilisez le package IISIntegration ou AzureAppServices (en installant le package Nuget et en l'ajoutant). Programme.cs sur votre WebHostBuilder), il devrait vous transmettre ces en-têtes. Cela fonctionne très bien pour moi dans Azure, car je dois parfois prendre des décisions en fonction du nom d’hôte qu’ils touchent. Les packages IIS/Azure transmettent également l’adresse IP distante d'origine. , que je connecte.

67
NPNelson

Si vous en avez besoin n'importe où dans votre application, vous devez créer un middleware. Définissez votre classe statique et votre méthode d'extension pour ajouter le middleware au pipeline de services comme ceci.

public class MyHttpContext
{
    private static IHttpContextAccessor m_httpContextAccessor;

    public static HttpContext Current => m_httpContextAccessor.HttpContext;

    public static string AppBaseUrl => $"{Current.Request.Scheme}://{Current.Request.Host}{Current.Request.PathBase}";

    internal static void Configure(IHttpContextAccessor contextAccessor)
    {
        m_httpContextAccessor = contextAccessor;
    }
}

public static class HttpContextExtensions
{
    public static void AddHttpContextAccessor(this IServiceCollection services)
    {
        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    }

    public static IApplicationBuilder UseHttpContext(this IApplicationBuilder app)
    {
        MyHttpContext.Configure(app.ApplicationServices.GetRequiredService<IHttpContextAccessor>());
        return app;
    }
}

Il peut être un peu redondant d'exposer le HttpContext dans ce cas mais je le trouve très utile.

Vous l'ajouteriez au pipeline dans votre méthode Configfure qui se trouve dans Startup.cs

app.UseHttpContext()

À partir de là, il est simple de l’utiliser n'importe où dans votre code.

var appBaseUrl = MyHttpContext.AppBaseUrl;
13
Rob

NPNelson answer fonctionne avec .Value.ToString ()

var baseUrl = $"{this.Request.Scheme}://{this.Request.Host.Value.ToString()}{this.Request.PathBase.Value.ToString()}";
0
hubert17