Как я могу получить базовый URL моего веб-приложения в ASP.NET MVC?

Как я могу быстро определить, какой корневой URL-адрес для моего приложения ASP.NET MVC? То есть, если IIS настроен на обслуживание моей заявки вhttp://example.com/foo/bar, затем я'Я хотел бы иметь возможность получить этот URL надежным способом, который неЭто связано с получением текущего URL-адреса из запроса и его разбиением каким-то хрупким способом, который ломается, если я перенаправлю свое действие.

Причина, по которой мне нужен базовый URL, заключается в том, что это веб-приложение вызывает другой, которому нужен корень для веб-приложения вызывающей стороны для целей обратного вызова.

Ответы на вопрос(20)

Вы можете использовать следующий скрипт:

<script type="text/javascript">
    var BASE_URL = '<%= ResolveUrl("~/") %>';
</script>

<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("~/");
        }
}
 Paul Zahra12 сент. 2014 г., 14:00
А ури есть? эм ...
 Jess09 дек. 2016 г., 20:01
+1 за использование, Также вы можете опустить Схему, чтобы она работала с http или https. Это означает, что вы можете начать URL с.//

В коде:

Url.Content("~/");

Синтаксис бритвы MVC3:

@Url.Content("~/")
 Serj Sagan13 авг. 2016 г., 01:31
Где код делаетUrl помощник доступен для вас сразу? Может быть, только вController, Конечно, не вViewModel или любой другойclass где вам может понадобиться это ..
 Mrchief21 апр. 2016 г., 04:15
Это нет работа. Это'просто добавлю/ вместо фактического имени.
 krillgar03 апр. 2014 г., 16:03
Это хорошо для использования на страницах Razor, но если выпытаясь передать URL на внешний источник, он выигралне могу дать вам полный URL.

<a href="~/#about">About us</a>

string url = HttpContext.Request.Url.AbsoluteUri;

что привязки IIS могут отличаться от ваших общедоступных URL-адресов (WCF I ').Я смотрю на вас), особенно с многопрофильными производственными машинами. Я склоняюсь к использованию конфигурации для явного определения "база" URL-адрес для внешних целей, так как он имеет тенденцию быть немного более успешным, чем извлечение его из объекта запроса.

 Ishmaeel06 мая 2014 г., 15:45
Также верно для серверов за балансировщиками нагрузки или прокси.
 Anonymous Type14 февр. 2011 г., 00:38
кажется разумным и менее склонным к ошибкам конфигурации.

аписать: 1stline получает весь URL-адрес + строку запроса. 2-я строка удалить локальный путь & запрос, последний '/' условное обозначение. 3-я строка добавляет '/' символ в последней позиции.

Uri url = System.Web.HttpContext.Current.Request.Url;
string UrlLink = url.OriginalString.Replace(url.PathAndQuery,"");
UrlLink = String.Concat(UrlLink,"/" );

Это прекрасно работает для меня (также с балансировщиком нагрузки):

@{
    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
 BlackTigerX11 июл. 2014 г., 00:05
Почему ты бы так поступил? вместо вызова Url.Action?
 Kjell Rilbe19 окт. 2012 г., 11:17
Кажется, работает в MVC3 тоже. Я использую это вjQuery.load() построить URL для контроллера и действия, которое я хочу вызвать:$('#myplaceholder').load('@(Html.Raw(HttpRuntime.AppDomainAppVirtualPath))/MyController/MyAction', ...);
 Jeff Dunlop18 мая 2015 г., 10:51
Безразлично»не работает при развертывании в Azure. В этом сценарии работают ответы с более высоким рейтингом.
Решение Вопроса

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

Если оно'нет, вы можете получить к нему через контекст:

var request = HttpContext.Current.Request
 Wyatt Barnett10 мар. 2014 г., 23:38
Что происходит, когда вы находитесь за балансировщиком нагрузки, а сервер действительно принимает запросы на10.55.44.33:1234 когда публичный URLexample.com?
 Andrew Hoffman31 мар. 2015 г., 22:44
@Url.Content("~") решает в"/"который нет базовый URL.
 UpTheCreek24 нояб. 2010 г., 16:14
@ Максим, вы можете заменитьUrl.Content ( "~")
 Adrian Grigore18 авг. 2009 г., 19:45
Я попробовал это, но ни HttpContext.Current.Request.Authority, ни HttpContext.Current.Request.Scheme не были определены.
 row112 окт. 2012 г., 04:10
Для MVC 4 я используюControllerContext.RequestContext.HttpContext.Request
 Ishmaeel08 мая 2014 г., 10:09
@WyattBarnett: Ах, я нене понимаю, что вы были владельцемтот ответ (который я проголосовал) и думал, что вы спрашиваете здесь искренне.
 programad19 янв. 2012 г., 14:04
Url.Content ( "~") сделал трюк здесь.
 Peter28 нояб. 2011 г., 11:21
Что я в итоге использовал: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("~"));
 David02 сент. 2011 г., 18:05
var urlHelper = new UrlHelper (html.ViewContext.RequestContext);
 Paul Zahra21 апр. 2016 г., 12:15
@WyattBarnett Я полагаю, что на самом деле это должно быть что-то вроде получения хоста из Request.Headers ["х-пересылаются-хозяин "]
 Maxim Zaslavsky15 авг. 2010 г., 09:38
Что такоеurlHelper.Content("~")? Как мне создать определениеurlHelper? Спасибо!
 Ishmaeel06 мая 2014 г., 15:38
@WyattBarnett: Вы помещаете общедоступный корень URL в файл конфигурации. Для этого случая не существует решения с нулевой конфигурацией (за исключением создания URL-адресов с помощью JS на стороне клиента - но это будет работать только для простых ссылок и не будет ухудшаться изящно).
 Wyatt Barnett27 апр. 2016 г., 18:17
@PaulZahra уверен, что так настроен ваш прокси - вы неэто вообще нужно пропустить, а заголовки x- * нестандартны для загрузки.

 <base href="~/">

Это преобразование свойства 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)
 jebar807 янв. 2015 г., 23:25
Это единственный ответ, который учитывает возможность работы сайта на порте, отличном от 80. Насколько мне известно, все остальные ответы небезопасны. Спасибо!

но, используя несколько ответов, я получил кое-что работающее:

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="">();
}
</ihttpcontextaccessor,></myclass,>

тогда сделайте это для вас так:

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}";
}
 Josh Dean28 мая 2013 г., 02:05
Где вы положили этот метод?
 mkb10 мар. 2018 г., 22:26
Host.ToUriComponent()наконец, и я смог получить объект запроса сUrl.ActionContext.HttpContext ввиду
 Милан21 мар. 2017 г., 20:11
upvote для решения .net core
 Serj Sagan15 авг. 2016 г., 00:29
В качестве обновления я больше не использую класс под названиемStaticsвместо этого я разбил его на более конкретные применения, так что в этом случае это вошло бы в мойUrlHelper учебный класс
 Serj Sagan28 мая 2013 г., 19:02
Это действительно зависит от того, как часто вам нужно его использовать ... если это одноразовое соглашение, просто поместите его в класс, где вам нужны эти данные, если вы планируете использовать его в нескольких классах в своем приложении, тогда я использую папка называетсяHelpers в основе моего приложения у меня естьstatic класс называетсяStatics и я положил функции, как указано выше ... просто убедитесь, что вы измените вышеpublic string GetBaseUrl() вpublic static string GetBaseUrl()

это расширение или модификация ответов, опубликованных здесь, но я использую просто следующую строку, и это работает:

Request.Url.GetLeftPart(UriPartial.Authority) + Url.Content("~")

Когда мой путь:http://host/iis_foldername/controller/action

тогда я получаю:http://host/iis_foldername/

который просматривает HttpContext.Current и решает, какой URL использовать (сервер разработки или работающий сервер), в зависимости от идентификатора хоста. HttpContext может даже предложить более простой способ сделать это, но это первый вариант, который я нашел, и он работает нормально.

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>
 emragins16 дек. 2015 г., 05:46
Я не тестировал, но сомневаюсь, что это сработает, если базовый URL-адрес является виртуальным. то есть. локальный / MYAPP

<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, надеюсь, это поможет

 hemp06 янв. 2018 г., 02:40
Кроме того, нет очков репутации, полученных за редактирование ответа.
 Andrew Day04 окт. 2017 г., 15:17
@hemp Отредактировал, но не голосовал за это? Надеюсь, что очки ценны для вас
 hemp08 окт. 2017 г., 03:24
Этот вопрос и связанные с ним ответы не былине полезно для моей конкретной проблемы, поэтому я нене пытайтесь проголосовать за любого из них. Я отредактировал этот, потому что случайно увидел его и подумал, что это может быть достойный ответ, если он правильно отформатирован. Просто пытаюсь быть хорошим гражданином.

какhttp://example.com/appAlias/... Вы можете попробовать это:

var req = HttpContext.Current.Request;
string baseUrl = string.Format("{0}://{1}/{2}", req.Url.Scheme, req.Url.Authority, req.ApplicationPath);

TPS.

new Uri(Request.Url, Url.Content("~"))

Ваш ответ на вопрос