假设我的网站托管在www.example.com的mywebsite文件夹中,并且我访问https://www.example.com/mywebsite/home/about。
如何在MVC控制器中获取基本网址部分?我要寻找的部分是https://www.example.com/mywebsite
由于我们无权访问ASP.NET Core中的Request.Url,因此此处列出的示例不起作用
假设我的网站托管在www.example.com的mywebsite文件夹中,并且我访问https://www.example.com/mywebsite/home/about。
如何在MVC控制器中获取基本网址部分?我要寻找的部分是https://www.example.com/mywebsite
由于我们无权访问ASP.NET Core中的Request.Url,因此此处列出的示例不起作用
Answers:
您仍然应该能够拼凑所需的内容。如果您的控制器继承自,则您可以访问请求对象Controller
。
如果您使用的是VS2017,请启动一个新的ASPNet Core MVC应用并将Homecontroller替换为:
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();
}
}
我只是在“ About”方法中加入了一些您可能感兴趣的内容,但是您应该浏览其余的请求类,以便了解还有哪些可用的东西。
正如@Tseng指出的那样,在IIS或Azure App Service后面运行Kestrel时可能会出现问题,但是如果使用IISIntegration包或AzureAppServices包(通过安装Nuget包并将其在Program.cs中添加到WebHostBuilder中),它将应该将这些标头转发给您。在Azure中,这对我来说非常有用,因为有时我必须根据他们命中的主机名来做出决定。IIS / Azure程序包还转发了我记录的原始远程IP地址。
如果您需要在应用程序中的任何位置使用此工具,则应该构建一个中间件。定义静态类和扩展方法,以将中间件添加到服务管道中,如下所示。
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方法中的管道中。
app.UseHttpContext()
从那里开始,很容易在代码中的任何地方使用它。
var appBaseUrl = MyHttpContext.AppBaseUrl;
NPNelson答案适用于.Value.ToString()
var baseUrl = $"{this.Request.Scheme}://{this.Request.Host.Value.ToString()}{this.Request.PathBase.Value.ToString()}";
ToString
在这里没有帮助。它string.Format
已经自动完成。
var baseUrl = Request.GetTypedHeaders().Referer.ToString();
这样,您可以捕获基本URL信息。
这就是我如何在Asp .Net Core 3.1版本中获得它的方法。
您可以从下面的链接访问资源。
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
}
string.Format("{0}://{1}{2}", Request.Url.Scheme, Request.Url.Authority, Url.Content("~"));
您可以在此处查看更多信息: 如何在ASP.NET MVC中获取Web应用程序的基本URL?