如何快速确定ASP.NET MVC应用程序的根URL?也就是说,如果IIS设置为通过http://example.com/foo/bar为我的应用程序提供服务,那么我希望能够以一种可靠的方式获取该URL,而无需涉及从请求并以某种易碎的方式将其切碎,如果我重新路由操作,该方法会中断。
我需要基本URL的原因是,此Web应用程序调用了另一个需要回调方Web应用程序根的应用程序。
如何快速确定ASP.NET MVC应用程序的根URL?也就是说,如果IIS设置为通过http://example.com/foo/bar为我的应用程序提供服务,那么我希望能够以一种可靠的方式获取该URL,而无需涉及从请求并以某种易碎的方式将其切碎,如果我重新路由操作,该方法会中断。
我需要基本URL的原因是,此Web应用程序调用了另一个需要回调方Web应用程序根的应用程序。
Answers:
假设您有一个Request对象可用,则可以使用:
string.Format("{0}://{1}{2}", Request.Url.Scheme, Request.Url.Authority, Url.Content("~"));
如果不可用,可以通过上下文进行访问:
var request = HttpContext.Current.Request
var request = HttpContext.Current.Request; urlBase = string.Format("{0}://{1}{2}", request.Url.Scheme, request.Url.Authority, (new System.Web.Mvc.UrlHelper(request.RequestContext)).Content("~"));
ControllerContext.RequestContext.HttpContext.Request
@Url.Content("~")
解析为"/"
,这不是基本网址。
因此,这里列出的所有方法都不适合我,但是使用一些答案,我得到了一些有用的方法:
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)也许更干净的方法是将其注入您的类中,首先在您的类中注册类型 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}";
}
Helpers
在我的应用程序的底部调用,我有一个static
名为的类,Statics
并且在其中放置了类似上面的功能...只需确保将上面的内容更改public string GetBaseUrl()
为public static string GetBaseUrl()
Statics
,而是将其分解成更特定的用途,因此在这种情况下,它将进入我的UrlHelper
类中
在代码中:
Url.Content("~/");
MVC3 Razor语法:
@Url.Content("~/")
/
而不是实际名称。
Url
帮手可以立即在哪里找到Code ?也许只有在Controller
。当然不是在ViewModel
或其他任何class
地方,你可能需要这个..
以下代码段在MVC4中非常适合我,不需要HttpContext
可用的代码段:
System.Web.HttpRuntime.AppDomainAppVirtualPath
jQuery.load()
来构造要调用的控制器和操作的URL: $('#myplaceholder').load('@(Html.Raw(HttpRuntime.AppDomainAppVirtualPath))/MyController/MyAction', ...);
依赖IIS的窍门是IIS绑定可以不同于您的公共URL(我正在看的WCF),尤其是在多宿主生产机器上。我倾向于引导使用配置为外部目的显式定义“基本” URL,因为这比从Request对象中提取URL更为成功。
这是asp.net属性到MVC的转换。几乎所有的人都跳舞,所有跳舞都获得root 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("~/");
}
}
<base>
。您也可以省略该计划,使其可以与http或https一起使用。这意味着您可以使用开头URL //
。
这对我来说很好(也适用于负载均衡器):
@{
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甚至可以提供一些更简单的方法来完成此操作,但这是我发现的第一个选项,并且效果很好。
这在ASP .NET MVC中有效4在任何控制器操作中,您都可以编写:1stline获取整个url + Query String。第二行删除本地路径和查询,最后一个'/'符号。第三行在最后一个位置添加“ /”符号。
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/ ...,您可以尝试以下操作:
var req = HttpContext.Current.Request;
string baseUrl = string.Format("{0}://{1}/{2}", req.Url.Scheme, req.Url.Authority, req.ApplicationPath);
在网页本身上:
<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项目,希望对您有所帮助
我把它放在我的_Layout.cshtml的头部
<base href="~/" />
对于MVC 4:
String.Format("{0}://{1}{2}", Url.Request.RequestUri.Scheme, Url.Request.RequestUri.Authority, ControllerContext.Configuration.VirtualPathRoot);
@{
var baseurl = Request.Url.Scheme + "://" + Request.Url.Host + ":" + Request.Url.Port + Url.Content("~");
}
@baseurl
只需一行即可获取BaseUrl
string baseUrl = new Uri(Request.Url, Url.Content("~")).AbsoluteUri;
//output example: https://stackoverflow.com
您也可以使用它。对于剃须刀页面,最好使用它。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<base href='@Url.AbsoluteContent("~/")'>
<title>@ViewBag.Title - ASP.NET Core Web Application</title>
<!-- ... -->
</head>
<body>
在项目的静态类(如实用程序类)中添加此函数:
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();
urlHelper.Content("~")
啊 如何创建定义urlHelper
?谢谢!