我怎么能得到我的webapp's基础URL在ASP。净MVC吗?

如何快速确定我的ASP的根URL是什么?NET MVC应用程序?例如,如果IIS设置为在http://example.com/foo/bar为我的应用程序服务,那么我希望能够以一种可靠的方式获得该URL,而不涉及从请求中获取当前URL,并以某种脆弱的方式将其分割,如果我重新路由我的操作,这种方式就会中断。

我需要基本URL的原因是这个web应用程序调用另一个需要根的调用者web应用程序的回调目的。

366577 次浏览

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

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

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

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

var request = HttpContext.Current.Request

依赖IIS的诀窍在于,IIS绑定可能不同于您的公共url(我指的是WCF),特别是对于多主场的生产机器。我倾向于使用配置显式地为外部目的定义“基本”url,因为这往往比从Request对象中提取它更成功。

在代码:

Url.Content("~/");

MVC3 Razor语法:

@Url.Content("~/")

这对我来说很好(也有负载均衡器):

@{
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

所以这里列出的这些方法都不适合我,但通过使用其中的一些答案,我找到了一些有用的方法:

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}";
}

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

<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("~/");
}
}

这是一个asp.net属性到MVC的转换。这是一个很好的方法。

声明一个helper类:

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)

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

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

使用

<a href="@baseUrl" class="link">Base URL</a>
这是在ASP .NET MVC 4工作 在任何控制器动作中,你都可以写: 1stline获取整个url+查询字符串。 第二行删除本地路径&查询,最后一个'/'符号。 第三行在最后一个位置添加“/”符号
Uri url = System.Web.HttpContext.Current.Request.Url;
string UrlLink = url.OriginalString.Replace(url.PathAndQuery,"");
UrlLink = String.Concat(UrlLink,"/" );

在简单的html和ASP。NET或ASP。如果你正在使用标签:

<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项目,希望它有帮助

对于具有应用程序别名的url,如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="~/" />

下面的方法对我很有效

var request = HttpContext.Request;
var appUrl = System.Web.HttpRuntime.AppDomainAppVirtualPath;


if (appUrl != "/")
appUrl = "/" + appUrl + "/";


var newUrl = string.Format("{0}://{1}{2}{3}/{4}", request.Url.Scheme, request.UrlReferrer.Host, appUrl, "Controller", "Action");

简单地在一行中获取BaseUrl

string baseUrl = new Uri(Request.Url, Url.Content("~")).AbsoluteUri;


//output example: https://stackoverflow.com

你也可以用这个。对于剃刀页,最好使用它比其他。

< a href = " https://ml-software。Ch /posts/getting-the-base-url-for-an-asp-net-core-mvc-web-application-in-your-static-javascript-files" rel="nofollow noreferrer">https://ml-software.ch/posts/getting-the-base-url-for-an-asp-net-core-mvc-web-application-in-your-static-javascript-files

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<base href='@Url.AbsoluteContent("~/")'>
<title>@ViewBag.Title - ASP.NET Core Web Application</title>
<!-- ... -->
</head>
<body>
@{
var baseurl = Request.Url.Scheme + "://" + Request.Url.Host + ":" + Request.Url.Port + Url.Content("~");
}
@baseurl
< p >——输出 http://localhost:49626/TEST/ < / p >

将此函数添加到项目的静态类中,如实用程序类:

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();

这是我的解决方案(使用。net core 3.1,在api控制器中):

string baseUrl = $"{Request.Scheme}://{Request.Headers.Where(h => h.Key == "Host").First().Value}";

在。net core 3.1中,我使用了这种方法:

$"{Request.Scheme}://{Request.Host}{Url.Content("~/")}"