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。
你应该仍然能够拼凑出你需要的东西。如果控制器继承自
如果您使用的是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?