我怎样才能得到我的web应用程序的基本URL在ASP.NET MVC?

我如何快速确定我的ASP.NET MVC应用程序的根URL是什么? 也就是说,如果IIS设置为在http://example.com/foo/bar上提供我的应用程序,那么我希望能够以可靠的方式获得该URL,而不需要从请求并以某种脆弱的方式砍断它,如果我重新路由我的行动,就会中断。

我需要的基本URL的原因是,这个Web应用程序调用另一个需要根的调用Web应用程序的callback目的。

假设你有一个Request对象可用,你可以使用:

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

如果不可用,您可以通过上下文获得它:

 var request = HttpContext.Current.Request 

所以这里列出的都没有为我工作,但使用一些答案,我有一些工作:

 public string GetBaseUrl() { var request = HttpContext.Current.Request; var appUrl = HttpRuntime.AppDomainAppVirtualPath; if (appUrl != "/") appUrl = "/" + appUrl; var baseUrl = string.Format("{0}://{1}{2}", request.Url.Scheme, request.Url.Authority, appUrl); return baseUrl; } 

ASP.NET Core / MVC 6的更新:

ASP.NET Core使这个过程更加痛苦,特别是如果你深入你的代码。 你有2个选项来获得HttpContext

1)从你的controller

 var model = new MyClass(HttpContext); 

然后在model

 private HttpContext currentContext; public MyClass(HttpContext currentContext) { this.currentContext = currentContext; } 

2)也许更简洁的方法是将它注入到你的类中,该类首先在启动时注册typesStartup:

 public void ConfigureServices(IServiceCollection services) { // Add framework services. services.AddMvc(); services.AddTransient<MyClass, MyClass>(); services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>(); } 

然后让它像你这样注入:

 private HttpContext currentContext; public MyClass(IHttpContextAccessor httpContextAccessor) { currentContext = httpContextAccessor.HttpContext; } 

在这两种情况下,这里是更新的.NET Core GetBaseUrl()

 public string GetBaseUrl() { var request = currentContext.Request; var host = request.Host.ToUriComponent(); var pathBase = request.PathBase.ToUriComponent(); return $"{request.Scheme}://{host}{pathBase}"; } 

在代码中:

 Url.Content("~/"); 

MVC3剃刀语法:

 @Url.Content("~/") 

也许这是在这里发布的答案的扩展或修改,但我使用简单的以下行,它的工作原理:

 Request.Url.GetLeftPart(UriPartial.Authority) + Url.Content("~") 

当我的path是: http://host/iis_foldername/controller/action
那么我收到: http://host/iis_foldername/

依靠IIS的技巧是IIS绑定可以不同于你的公共URL(我正在看你的WCF),尤其是在多宿主生产机器上。 我倾向于使用configuration来为外部目的明确定义“基础”url,因为这往往比从Request对象中提取更成功。

下面的代码片段在MVC4中很适合我,并且不需要可用的HttpContext

 System.Web.HttpRuntime.AppDomainAppVirtualPath 

对于绝对的基本URL使用这个。 适用于HTTP和HTTPS。

 new Uri(Request.Url, Url.Content("~")) 

这是一个asp.net属性到MVC的转换 。 这是一个几乎所有的歌舞都得到根URL的方法。

声明一个辅助类:

 namespace MyTestProject.Helpers { using System.Web; public static class PathHelper { public static string FullyQualifiedApplicationPath(HttpRequestBase httpRequestBase) { string appPath = string.Empty; if (httpRequestBase != null) { //Formatting the fully qualified website url/name appPath = string.Format("{0}://{1}{2}{3}", httpRequestBase.Url.Scheme, httpRequestBase.Url.Host, httpRequestBase.Url.Port == 80 ? string.Empty : ":" + httpRequestBase.Url.Port, httpRequestBase.ApplicationPath); } if (!appPath.EndsWith("/")) { appPath += "/"; } return appPath; } } } 

用法:

要从控制器使用:

 PathHelper.FullyQualifiedApplicationPath(ControllerContext.RequestContext.HttpContext.Request) 

在视图中使用:

 @using MyTestProject.Helpers PathHelper.FullyQualifiedApplicationPath(Request) 

在MVC _Layout.cshtml中:

 <base href="@Request.GetBaseUrl()" /> 

那就是我们用的!

 public static class ExtensionMethods { public static string GetBaseUrl(this HttpRequestBase request) { if (request.Url == (Uri) null) return string.Empty; else return request.Url.Scheme + "://" + request.Url.Authority + VirtualPathUtility.ToAbsolute("~/"); } } 

这对我来说很好(还有一个负载平衡器):

 @{ var urlHelper = new UrlHelper(Html.ViewContext.RequestContext); var baseurl = urlHelper.Content(“~”); } <script> var base_url = "@baseurl"; </script> 

特别是如果您使用的是非标准的端口号,那么使用Request.Url.Authority首先看起来像一个好的领导,但在LB环境中失败。

你可以有一个静态方法来查看HttpContext.Current,并根据主机ID决定使用哪个URL(开发或活动服务器)。 HttpContext甚至可以提供一些更简单的方法来做到这一点,但这是我发现的第一个选项,它工作正常。

您可以在视图中使用以下脚本:

 <script type="text/javascript"> var BASE_URL = '<%= ResolveUrl("~/") %>'; </script> 

对于ASP.NET MVC 4,它有点不同:

 string url = HttpContext.Request.Url.AbsoluteUri; 

这是工作在ASP .NET MVC 4在任何控制器动作,你可以写:1stline获取整个url+查询string。 第二行删除本地path和查询,最后一个'/'符号。 第三行添加'/'符号在最后的位置。

 Uri url = System.Web.HttpContext.Current.Request.Url; string UrlLink = url.OriginalString.Replace(url.PathAndQuery,""); UrlLink = String.Concat(UrlLink,"/" ); 

在简单的HTML和ASP.NET或ASP.NET MVC中,如果您使用的是标签:

 <a href="~/#about">About us</a> 

对于像http://example.com/appAlias/这样的应用程序别名的url…您可以试试这个:

 var req = HttpContext.Current.Request; string baseUrl = string.Format("{0}://{1}/{2}", req.Url.Scheme, req.Url.Authority, req.ApplicationPath); 

对于MVC 4:

 String.Format("{0}://{1}{2}", Url.Request.RequestUri.Scheme, Url.Request.RequestUri.Authority, ControllerContext.Configuration.VirtualPathRoot); 

也许这是一个更好的解决scheme。

 @{ var baseUrl = @Request.Host("/"); } 

运用

 <a href="@baseUrl" class="link"Base URL</a> 

我把它放在我的_Layout.cshtml的头部

  <base href="~/" /> 

在网页上:

 <input type="hidden" id="basePath" value="@string.Format("{0}://{1}{2}", HttpContext.Current.Request.Url.Scheme, HttpContext.Current.Request.Url.Authority, Url.Content("~"))" /> 

在javascript中:

 function getReportFormGeneratorPath() { var formPath = $('#reportForm').attr('action'); var newPath = $("#basePath").val() + formPath; return newPath; } 

这适用于我的MVC项目,希望它有帮助