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

How can I get the baseurl of my site in ASP.NET Core?

假设我的网站托管在www.example.com的my website文件夹中,我访问https://www.example.com/mywebsite/home/about。

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

这里列出的示例不起作用,因为我们无法访问ASP.NET核心中的request.url。


你应该仍然能够拼凑出你需要的东西。如果控制器继承自Controller,则可以访问请求对象。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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应用程序服务后面运行kestrel时可能会遇到问题,但是如果使用iisingegration包或azureappservices包(通过安装nuget包并将其添加到program.cs中到webhostbuilder),它应该将这些头转发给您。在Azure中它对我很有用,因为有时我必须根据它们命中的主机名做出决定。IIS/Azure包还转发我记录的原始远程IP地址。


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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可能有点多余,但我发现它非常有用。

您可以将它添加到位于startup.cs中的configfure方法中的管道中。

1
app.UseHttpContext()

在代码中的任何地方使用它都很简单。

1
var appBaseUrl = MyHttpContext.AppBaseUrl;


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

您可以在此处查看更多信息:如何在ASP.NET MVC中获取webapp的基本URL?