如何在ASP.NET Core中获取我的站点的baseurl?

时间:2017-04-20 17:56:06

标签: asp.net asp.net-core asp.net-core-mvc

假设我的网站位于 www.example.com mywebsite 文件夹中,我访问https://www.example.com/mywebsite/home/about

如何在MVC控制器中获取基本URL部分?我要找的部分是 https://www.example.com/mywebsite

列出的示例here无法正常工作,因为我们无法访问ASP.NET Core中的Request.Url

6 个答案:

答案 0 :(得分:57)

你仍然可以拼凑你需要的东西。如果控制器继承自Controller

,则可以访问请求对象

如果您使用的是VS2017,请启动一个新的ASPNet Core MVC应用程序,并将家用控制器替换为:

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

我只是在"关于"中添加了一些您可能感兴趣的内容。方法,但您应该探索请求类的其余部分,以便了解其他可用的内容。

正如@Tseng指出的那样,在IIS或Azure App Service后面运行Kestrel时可能会出现问题,但是如果您使用IISIntegration包或AzureAppServices包(通过安装Nuget包并将它在Program.cs中添加到WebHostBuilder中) ),它应该将这些标题转发给你。它在Azure中对我很有用,因为我有时必须根据它们命中的主机名做出决定。 IIS / Azure包还转发我记录的原始远程IP地址。

答案 1 :(得分:13)

如果你在应用程序的任何地方需要它,那么你应该构建一个中间件。 定义静态类和扩展方法,以便将中间件添加到服务管道中。

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

在这种情况下暴露HttpContext可能有点多余,但我发现它非常有帮助。

您可以在Confupfure方法中将其添加到管道中,该方法位于Startup.cs

app.UseHttpContext()

从那里可以很容易地在代码中的任何地方使用它。

var appBaseUrl = MyHttpContext.AppBaseUrl;

答案 2 :(得分:1)

var baseUrl = Request.GetTypedHeaders().Referer.ToString();

这样,您可以捕获基本URL信息。

这是我如何在Asp .Net Core 3.1版本中获得它的方法。

您可以从下面的链接访问资源。

Reference

答案 3 :(得分:0)

NPNelson答案适用于.Value.ToString()

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

答案 4 :(得分:0)

using Microsoft.AspNetCore.Http;    

public void ConfigureServices(IServiceCollection services)
{
     services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}
    
    
public AccountController(IHttpContextAccessor httpContextAccessor)
{
     var request = httpContextAccessor.HttpContext.Request;
     var domain = $"{request.Scheme}://{request.Host}";
     //domain => https://varunsoft.in
}

答案 5 :(得分:-2)

string.Format("{0}://{1}{2}", Request.Url.Scheme, Request.Url.Authority, Url.Content("~"));

您可以在此处查看更多信息: How can I get my webapp's base URL in ASP.NET MVC?