假设我的网站位于 www.example.com 的 mywebsite 文件夹中,我访问https://www.example.com/mywebsite/home/about。
如何在MVC控制器中获取基本URL部分?我要找的部分是 https://www.example.com/mywebsite
列出的示例here无法正常工作,因为我们无法访问ASP.NET Core中的Request.Url
答案 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版本中获得它的方法。
您可以从下面的链接访问资源。
答案 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?