Как я могу получить свой базовый URL-адрес webapp в ASP.NET MVC?
Как я могу быстро определить, какой корневой URL-адрес для моего приложения ASP.NET MVC? Т.е. если IIS настроен на обслуживание моего приложения в http://example.com/foo/bar, то я бы хотел, чтобы этот URL был надежно это не связано с получением текущего URL-адреса из запроса и прерыванием его хрупким способом, который прерывается, если я перенаправляю свое действие.
Причина, по которой мне нужен базовый URL-адрес, заключается в том, что это веб-приложение вызывает другой, которому нужен корень в веб-приложении вызывающего абонента для целей обратного вызова.
Ответы
Ответ 1
Предполагая, что у вас есть объект Request, вы можете использовать:
string.Format("{0}://{1}{2}", Request.Url.Scheme, Request.Url.Authority, Url.Content("~"));
Если он недоступен, вы можете перейти к нему через контекст:
var request = HttpContext.Current.Request
Ответ 2
Поэтому ни один из перечисленных здесь не работал у меня, но, используя несколько ответов, я получил что-то:
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}";
}
Ответ 3
В коде:
Url.Content("~/");
Синтаксис Razor MVC3:
@Url.Content("~/")
Ответ 4
Возможно, это расширение или изменение ответов, размещенных здесь, но я использую просто следующую строку, и она работает:
Request.Url.GetLeftPart(UriPartial.Authority) + Url.Content("~")
Когда мой путь: http://host/iis_foldername/controller/action
то я получаю: http://host/iis_foldername/
Ответ 5
Трюк с использованием IIS заключается в том, что привязки IIS могут отличаться от ваших общедоступных URL (WCF, на которые я смотрю на вас), особенно с многопользовательскими машинами. Я склонен к вектору к использованию конфигурации, чтобы явно определить "базовый" url для внешних целей, поскольку это имеет тенденцию быть немного более успешным, чем извлечение его из объекта Request.
Ответ 6
Следующий фрагмент отлично работает для меня в MVC4 и не нужен HttpContext
:
System.Web.HttpRuntime.AppDomainAppVirtualPath
Ответ 7
Для абсолютного базового URL используйте это. Работает как с HTTP, так и с HTTPS.
new Uri(Request.Url, Url.Content("~"))
Ответ 8
Это преобразование свойства 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)
Ответ 9
В 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("~/");
}
}
Ответ 10
Это отлично работает для меня (также с балансировкой нагрузки):
@{
var urlHelper = new UrlHelper(Html.ViewContext.RequestContext);
var baseurl = urlHelper.Content("~");
}
<script>
var base_url = "@baseurl";
</script>
Особенно, если вы используете нестандартные номера портов, использование Request.Url.Authority сначала кажется хорошим, но неудачно в среде LB.
Ответ 11
У вас может быть статический метод, который рассматривает HttpContext.Current и решает, какой URL использовать (развитие или живой сервер) в зависимости от идентификатора хоста. HttpContext может предложить даже более простой способ сделать это, но это первый вариант, который я нашел, и он отлично работает.
Ответ 12
Вы можете использовать следующий вид script:
<script type="text/javascript">
var BASE_URL = '<%= ResolveUrl("~/") %>';
</script>
Ответ 13
Для ASP.NET MVC 4 это немного другое:
string url = HttpContext.Request.Url.AbsoluteUri;
Ответ 14
Это работает в 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,"/" );
Ответ 15
в простых html и ASP.NET или ASP.NET MVC, если вы используете тег:
<a href="~/#about">About us</a>
Ответ 16
На самой веб-странице:
<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, надеюсь, что он поможет
Ответ 17
Для 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);
Ответ 18
Может быть, это лучшее решение.
@{
var baseUrl = @Request.Host("/");
}
с помощью
<a href="@baseUrl" class="link">Base URL</a>
Ответ 19
Я положил это в голову моего _Layout.cshtml
<base href="~/" />
Ответ 20
Для MVC 4:
String.Format("{0}://{1}{2}", Url.Request.RequestUri.Scheme, Url.Request.RequestUri.Authority, ControllerContext.Configuration.VirtualPathRoot);
Ответ 21
Для ASP.NET Core 2:
private string SiteRoot => $"{Request.Scheme}://{Request.Host}{Request.PathBase}";
Ответ 22
Следующее сработало для меня
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");
Ответ 23
Просто в одну строку получи BaseUrl
string baseUrl = new Uri(Request.Url, Url.Content("~")).AbsoluteUri;
//output example: https://stackoverflow.com
Ответ 24
Также вы можете использовать это. Для бритвенных страниц лучше использовать его, чем другие.
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>