Как я могу получить базовый URL-адрес моего веб-приложения ASP.NET MVC?
Как я могу быстро определить, что корневой URL для моего ASP.NET приложение MVC? Т. е., если IIS настроен для обслуживания моего приложения в http://example.com/foo/bar, то я хотел бы иметь возможность получить этот URL-адрес надежным способом, который не включает в себя получение текущего URL-адреса из запроса и измельчение его каким-то хрупким способом, который ломается, если я перенаправляю свое действие.
причина, по которой мне нужен базовый URL, заключается в том, что это веб-приложение вызывает другой, который нуждается корень для вызывающего веб-приложения для целей обратного вызова.
20 ответов:
Если у вас есть объект запроса, вы можете использовать:
string.Format("{0}://{1}{2}", Request.Url.Scheme, Request.Url.Authority, Url.Content("~"));если он недоступен, вы можете добраться до него через контекст:
var request = HttpContext.Current.Request
поэтому ни один из перечисленных здесь не работал для меня, но, используя несколько ответов, я получил что-то работающее:
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 варианта попасть вHttpContext1) передайте его от вашего
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 CoreGetBaseUrl():public string GetBaseUrl() { var request = currentContext.Request; var host = request.Host.ToUriComponent(); var pathBase = request.PathBase.ToUriComponent(); return $"{request.Scheme}://{host}{pathBase}"; }
может быть, это расширение или модификация ответов, опубликованных здесь, но я использую просто следующую строку, и она работает:
Request.Url.GetLeftPart(UriPartial.Authority) + Url.Content("~")когда мой путь:
http://host/iis_foldername/controller/action
тогда я получаю:http://host/iis_foldername/
трюк с опорой на IIS заключается в том, что привязки IIS могут отличаться от ваших общедоступных URL-адресов (WCF я смотрю на вас), особенно с многосетевыми производственными машинами. Я склоняюсь к использованию конфигурации для явного определения" базового " url для внешних целей, поскольку это имеет тенденцию быть немного более успешным, чем извлечение его из объекта запроса.
следующий фрагмент кода прекрасно работает для меня в MVC4, и не нуждается в
HttpContextв наличии:System.Web.HttpRuntime.AppDomainAppVirtualPath
для абсолютного базового URL используйте это. Работает как с HTTP, так и с HTTPS.
new Uri(Request.Url, Url.Content("~"))
это преобразование 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)
в 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("~/"); } }
это отлично работает для меня (также с балансировщиком нагрузки):
@{ var urlHelper = new UrlHelper(Html.ViewContext.RequestContext); var baseurl = urlHelper.Content(“~”); } <script> var base_url = "@baseurl"; </script>особенно если вы используете нестандартные номера портов, используя запрос.Url-адрес.Авторитет сначала кажется хорошим руководством, но терпит неудачу в среде LB.
У вас может быть статический метод, который смотрит на HttpContext.Текущий и решает, какой URL использовать (development или live server) в зависимости от идентификатора хоста. HttpContext может даже предложить более простой способ сделать это, но это первый вариант, который я нашел, и он отлично работает.
вы можете использовать следующий скрипт в вид:
<script type="text/javascript"> var BASE_URL = '<%= ResolveUrl("~/") %>'; </script>
это работает в ASP .NET MVC 4 В любом действии контроллера вы можете написать: 1stline получает весь URL-адрес+строка запроса. 2-я строка удалить локальный путь и запрос, последний символ'/'. 3-я строка добавить символ ' / ' на последней позиции.
Uri url = System.Web.HttpContext.Current.Request.Url; string UrlLink = url.OriginalString.Replace(url.PathAndQuery,""); UrlLink = String.Concat(UrlLink,"/" );
для MVC 4:
String.Format("{0}://{1}{2}", Url.Request.RequestUri.Scheme, Url.Request.RequestUri.Authority, ControllerContext.Configuration.VirtualPathRoot);
может быть, это лучшее решение.
@{ var baseUrl = @Request.Host("/"); }используя
<a href="@baseUrl" class="link"Base URL</a>
для 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);
на странице:
<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, надеюсь, что это поможет
Comments