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



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



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

1027   20  

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 варианта попасть в 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 CoreGetBaseUrl():

public string GetBaseUrl()
{
    var request = currentContext.Request;

    var host = request.Host.ToUriComponent();

    var pathBase = request.PathBase.ToUriComponent();

    return $"{request.Scheme}://{host}{pathBase}";
}

В Коде:

Url.Content("~/");

MVC3 Razor синтаксис:

@Url.Content("~/")

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

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 немного отличается:

string url = HttpContext.Request.Url.AbsoluteUri;

это работает в 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,"/" );

в простом html и ASP.NET или ASP.NET MVC, если вы используете тег:

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

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

Я положил это в голову моего _Layout.cshtml

 <base href="~/" />

Comments

    Ничего не найдено.