如何快速确定我的ASP.NET MVC应用程序的根URL是什么?也就是说,如果IIS设置为在http://example.com/foo/bar上提供我的应用程序,那么我希望能够以可靠的方式获取该URL,而不需要从请求中获取当前URL并以某种脆弱的方式将其切碎如果我重新布置我的动作,就会中断。如何在ASP.NET MVC中获取我的webapp的基URL?
我需要基本URL的原因是,此Web应用程序调用另一个需要根的呼叫Web应用程序的回调目的。
如何快速确定我的ASP.NET MVC应用程序的根URL是什么?也就是说,如果IIS设置为在http://example.com/foo/bar上提供我的应用程序,那么我希望能够以可靠的方式获取该URL,而不需要从请求中获取当前URL并以某种脆弱的方式将其切碎如果我重新布置我的动作,就会中断。如何在ASP.NET MVC中获取我的webapp的基URL?
我需要基本URL的原因是,此Web应用程序调用另一个需要根的呼叫Web应用程序的回调目的。
假设你有一个Request对象,你可以使用:
string.Format("{0}://{1}{2}", Request.Url.Scheme, Request.Url.Authority, Url.Content("~"));
如果它不可用,您可以通过上下文得到它:
var request = HttpContext.Current.Request
您可以使用静态方法查看HttpContext.Current并根据主机ID决定使用哪个URL(开发或实时服务器)。 HttpContext甚至可以提供一些更简单的方法来完成它,但这是我找到的第一个选项,它工作正常。
诀窍与依赖于IIS IIS绑定可以不同于你的公共URL(我正在看你的WCF),尤其是在多宿主生产机器上。我倾向于使用配置来为外部目的显式定义“基础”url,因为这往往比从Request对象中提取它更成功。
似乎明智,不太容易出现配置错误。 – 2011-02-13 23:38:28
同样适用于负载均衡器或代理服务器之后的服务器。 – Ishmaeel 2014-05-06 13:45:12
这对我来说工作正常(也带有负载平衡器):
@{
var urlHelper = new UrlHelper(Html.ViewContext.RequestContext);
var baseurl = urlHelper.Content(“~”);
}
<script>
var base_url = "@baseurl";
</script>
特别是如果你正在使用非标准端口号,使用Request.Url.Authority首先看起来像一个好的领导,但在LB环境中失败。
下面的代码片段很好地工作,我在MVC4,并不需要一个HttpContext
可供选择:
System.Web.HttpRuntime.AppDomainAppVirtualPath
似乎也适用于MVC3。我在'jQuery.load()'中使用它来构造我想调用的控制器和动作的URL: '$('#myplaceholder')。load('@(Html.Raw(HttpRuntime.AppDomainAppVirtualPath))/ MyController/MyAction',...);' – 2012-10-19 09:17:56
你为什么要那样做?而不是调用Url.Action? – BlackTigerX 2014-07-10 22:05:10
部署到Azure时不起作用。在这种情况下,评分较高的答案有效 – 2015-05-18 08:51:45
所以没有列在这里为我工作,但使用一些答案的那些,我得到的东西的工作:
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核心/ 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)也许更清洁的方法是把它注射进入你的班级,开始在你的类型中注册Startup:
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}";
}
你把这个方法放在哪里? – 2013-05-28 00:05:07
这真的取决于你需要多久使用它......如果这是一次性使用交易,那么就把它放在你需要这些数据的类中,如果你预期在你的应用中的多个类中使用它,那么我使用一个名为'Helpers'的文件夹在我的应用程序的基础中,我有一个名为'Statics'的静态类,并且把上面的函数放在那里......只要确保你从'public string GetBaseUrl()'到'public static string GetBaseUrl()' – 2013-05-28 17:02:57
作为一个更新,我不再使用一个名为'Statics'的类,而是将它分解成更具体的用途,所以在这种情况下,这将进入我的'UrlHelper'类 – 2016-08-14 22:29:57
您可以使用视图下面的脚本:
<script type="text/javascript">
var BASE_URL = '<%= ResolveUrl("~/") %>';
</script>
也许这是在这里发布的答案的扩展或修改,但我使用简单的下面一行,它的工作原理:
Request.Url.GetLeftPart(UriPartial.Authority) + Url.Content("~")
当我的路径是:http://host/iis_foldername/controller/action
后来我收到:http://host/iis_foldername/
对于ASP.NET MVC 4这是一个有点不同:
string url = HttpContext.Request.Url.AbsoluteUri;
对于一个绝对的基本URL使用。适用于HTTP和HTTPS。
new Uri(Request.Url, Url.Content("~"))
对于MVC 4:
String.Format("{0}://{1}{2}", Url.Request.RequestUri.Scheme, Url.Request.RequestUri.Authority, ControllerContext.Configuration.VirtualPathRoot);
在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("~/");
}
}
而Uri是?呃... – 2014-09-12 12:00:47
+1使用'
This is a conversion of an asp.net property to MVC。这是一个几乎所有的歌唱都跳舞得到根网址的方法。
声明一个辅助类:
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)
这是唯一的答案,说明网站在80以外的端口上运行的可能性。就我而言,所有其他答案都是不安全的。谢谢! – jebar8 2015-01-07 22:25:02
也许是更好的解决方案。
@{
var baseUrl = @Request.Host("/");
}
使用
<a href="@baseUrl" class="link"Base URL</a>
我没有测试,但我怀疑这将工作时,基地的网址是直接虚拟。即。 localhost/myApp – emragins 2015-12-16 04:46:12
这是在ASP .NET MVC 4 工作中,你可以写任何控制器动作: 1stline获得了整个网址+查询字符串。 第二行删除本地路径&查询,最后一个'/'符号。 第3行在最后位置添加'/'符号。
Uri url = System.Web.HttpContext.Current.Request.Url;
string UrlLink = url.OriginalString.Replace(url.PathAndQuery,"");
UrlLink = String.Concat(UrlLink,"/");
如果您使用的标签:
<a href="~/#about">About us</a>
在网页本身:
<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项目,希望它h ELPS
对于aplication别名像http://example.com/appAlias/网址...你可以试试这个:
var req = HttpContext.Current.Request;
string baseUrl = string.Format("{0}://{1}/{2}", req.Url.Scheme, req.Url.Authority, req.ApplicationPath);
我把这个在我_Layout.cshtml
<base href="~/" />
我想这头,但也HttpContext.Current.Request.Authority,也没有HttpContext.Current.Request.Scheme被定义。 – 2009-08-18 17:45:27
什么是'urlHelper.Content(“〜”)'?我如何创建定义'urlHelper'?谢谢! – 2010-08-15 07:38:54
@Maxim,你可以替代** Url.Content(“〜”)** – UpTheCreek 2010-11-24 15:14:19