Подтвердить что ты не робот

Как создать абсолютные URL-адреса с помощью https в MVC3?

Я использую MVC3 и пытаюсь обслуживать контент из https, проблема в том, что когда я вызываю Url.Content, файлы по-прежнему обслуживаются с http с использованием относительного URL-адреса. Я думал, что эта проблема была рассмотрена в MVC3, но я не могу найти никакого решения. Кто-нибудь знает, если эта проблема по сути решена в MVC3 и как ее выполнить, или мне нужно создать свои собственные вспомогательные методы для генерации абсолютных Urls на основе протокола?

4b9b3361

Ответ 1

Возможно, вы можете реализовать свое собственное решение, используя VirtualPathUtility.ToAbsolute. Возможно, что-то вроде этого:

public static class UrlHelperExtension {
  public static string Absolute(this UrlHelper url, string relativeOrAbsolute) {
    var uri = new Uri(relativeOrAbsolute, UriKind.RelativeOrAbsolute);
    if (uri.IsAbsoluteUri) {
      return relativeOrAbsolute;
    }
    // At this point, we know the url is relative.
    return VirtualPathUtility.ToAbsolute(relativeOrAbsolute);
  }
}

который вы бы использовали, например:

@Url.Absolute(Url.Content("~/Content/Image.png"))

(Не испытал это сам, не стесняйтесь играть, чтобы он работал правильно.)

Это помогает вам генерировать абсолютные URL-адреса для ваших файлов содержимого. Чтобы изменить схему результирующих URL-адресов, вы можете создать дополнительный метод расширения, который манипулирует схемой данных URL-адресов, чтобы они были HTTPS или что-то еще.

Как отмечает Халид в комментариях, подобные методы расширения уже доступны в различных проектах с открытым исходным кодом, которые вы можете использовать (учитывая, что разрешена лицензия). Пример можно найти здесь.

Ответ 3

Вы можете использовать Url.RouteUrl, некоторые из перегрузок принимают параметр протокола, выглядит примерно так:

Url.RouteUrl("Product", new { itemId = "123456" }, "https");

Взгляните на перегрузки и посмотрите, какой из них вы можете использовать

Ответ 4

Если вы не хотите "строить" URL-адрес и просто хотите полный путь к текущей странице, это сделает трюк

Context.Server.UrlEncode(Context.Request.Url.AbsoluteUri)

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