如何快速确定ASP.NET MVC应用程序的根URL?即,如果IIS设置为在http://example.com/foo/bar处为我的应用程序提供服务,那么我希望能够以可靠的方式获取该URL,而不涉及从请求获取当前URL并将其删除如果我重新开始行动,那一些脆弱的方式就会破裂。
我需要基本URL的原因是此Web应用程序调用另一个需要root用户来调用Web应用程序以进行回调。
答案 0 :(得分:369)
假设您有一个Request对象,您可以使用:
string.Format("{0}://{1}{2}", Request.Url.Scheme, Request.Url.Authority, Url.Content("~"));
如果它不可用,您可以通过上下文访问它:
var request = HttpContext.Current.Request
答案 1 :(得分:94)
所以这里列出的没有一个对我有用,但是使用了一些答案,我得到了一些工作:
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
会让这个过程变得更加痛苦,特别是如果你的代码很深。您有两个选项可以访问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}";
}
答案 2 :(得分:61)
在代码中:
Url.Content("~/");
MVC3 Razor语法:
@Url.Content("~/")
答案 3 :(得分:39)
也许是这里发布的答案的扩展或修改,但我只使用以下行并且它可以工作:
Request.Url.GetLeftPart(UriPartial.Authority) + Url.Content("~")
当我的路径是:http://host/iis_foldername/controller/action
然后我收到:http://host/iis_foldername/
答案 4 :(得分:25)
依赖IIS的诀窍是IIS绑定可能与您的公共URL(我正在看着您的WCF)不同,特别是对于多宿主生产机器。我倾向于使用配置来明确定义用于外部目的的“基础”URL,因为这比从Request对象中提取它更加成功。
答案 5 :(得分:25)
以下代码段在MVC4中对我很有效,并且不需要HttpContext
可用:
System.Web.HttpRuntime.AppDomainAppVirtualPath
答案 6 :(得分:19)
对于绝对基本URL,请使用此选项。适用于HTTP和HTTPS。
new Uri(Request.Url, Url.Content("~"))
答案 7 :(得分:15)
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)
答案 8 :(得分:12)
在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("~/");
}
}
答案 9 :(得分:5)
这对我来说很好(也有负载均衡器):
@{
var urlHelper = new UrlHelper(Html.ViewContext.RequestContext);
var baseurl = urlHelper.Content(“~”);
}
<script>
var base_url = "@baseurl";
</script>
特别是如果您使用的是非标准端口号,则使用Request.Url.Authority最初看起来好像很好,但在LB环境中失败。
答案 10 :(得分:3)
对于ASP.NET MVC 4,它有点不同:
string url = HttpContext.Request.Url.AbsoluteUri;
答案 11 :(得分:3)
在网页上:
System.Xml.Linq
在javascript中:
<input type="hidden" id="basePath" value="@string.Format("{0}://{1}{2}",
HttpContext.Current.Request.Url.Scheme,
HttpContext.Current.Request.Url.Authority,
Url.Content("~"))" />
这适用于我的MVC项目,希望它有所帮助
答案 12 :(得分:3)
在简单的html和ASP.NET或ASP.NET MVC中如果使用标记:
<a href="~/#about">About us</a>
答案 13 :(得分:3)
这适用于ASP .NET MVC 4 在任何控制器操作中,您可以编写: 1stline获取整个URL +查询字符串。 第二行删除本地路径&amp;查询,最后&#39; /&#39;符号。 第3行添加&#39; /&#39;最后一个位置的符号。
Uri url = System.Web.HttpContext.Current.Request.Url;
string UrlLink = url.OriginalString.Replace(url.PathAndQuery,"");
UrlLink = String.Concat(UrlLink,"/" );
答案 14 :(得分:3)
您可以使用静态方法查看HttpContext.Current,并根据主机ID决定使用哪个URL(开发服务器或实时服务器)。 HttpContext甚至可以提供一些更简单的方法,但这是我找到的第一个选项,它工作正常。
答案 15 :(得分:3)
您可以在视图中使用以下脚本:
<script type="text/javascript">
var BASE_URL = '<%= ResolveUrl("~/") %>';
</script>
答案 16 :(得分:2)
也许这是一个更好的解决方案。
@{
var baseUrl = @Request.Host("/");
}
使用
<a href="@baseUrl" class="link">Base URL</a>
答案 17 :(得分:2)
对于包含http://example.com/appAlias/等应用别名的网址...您可以尝试:
var req = HttpContext.Current.Request;
string baseUrl = string.Format("{0}://{1}/{2}", req.Url.Scheme, req.Url.Authority, req.ApplicationPath);
答案 18 :(得分:2)
我把它放在我的_Layout.cshtml
的头部 <base href="~/" />
答案 19 :(得分:1)
对于MVC 4:
String.Format("{0}://{1}{2}", Url.Request.RequestUri.Scheme, Url.Request.RequestUri.Authority, ControllerContext.Configuration.VirtualPathRoot);
答案 20 :(得分:1)
@{
var baseurl = Request.Url.Scheme + "://" + Request.Url.Host + ":" + Request.Url.Port + Url.Content("~");
}
@baseurl
答案 21 :(得分:1)
这是我的解决方案(在api控制器中使用.net core 3.1):
string baseUrl = $"{Request.Scheme}://{Request.Headers.Where(h => h.Key == "Host").First().Value}";
答案 22 :(得分:1)
在.net core 3.1中,我使用了这种方法:
$"{Request.Scheme}://{Request.Host}{Url.Content("~/")}"
答案 23 :(得分:0)
以下内容对我来说很有效
echo get_post_field('post_content', $id);
答案 24 :(得分:0)
只需一行即可获取BaseUrl
string baseUrl = new Uri(Request.Url, Url.Content("~")).AbsoluteUri;
//output example: https://stackoverflow.com
答案 25 :(得分:0)
您也可以使用它。对于剃须刀页面,最好使用其他页面。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<base href='@Url.AbsoluteContent("~/")'>
<title>@ViewBag.Title - ASP.NET Core Web Application</title>
<!-- ... -->
</head>
<body>
答案 26 :(得分:0)
在类似于实用程序类的项目的静态类中添加此功能:
utility.cs 内容:
public static class Utility
{
public static string GetBaseUrl()
{
var request = HttpContext.Current.Request;
var urlHelper = new UrlHelper(request.RequestContext);
var baseUrl = $"{request.Url.Scheme}://{request.Url.Authority}{urlHelper.Content("~")}";
return baseUrl;
}
}
在任何地方使用此代码并享受它:
var baseUrl = Utility.GetBaseUrl();