Как создать абсолютные URL с помощью https в MVC3? - PullRequest
18 голосов
/ 04 апреля 2011

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

Ответы [ 4 ]

28 голосов
/ 04 апреля 2011

Возможно, вы сможете реализовать свое собственное решение, используя 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 или чем-то еще.

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

15 голосов
/ 05 апреля 2012

Решение, которое не использует методы расширения или жестко кодирует протокол, как предложено @BlackTigerX:

Url.RouteUrl("Default", new { Action = "About" }, Request.Url.Scheme)

, как предлагается в следующей статье: http://captaincodeman.com/2010/02/03/absolute-urls-using-mvc-without-extension-methods/

10 голосов
/ 04 апреля 2011

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

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

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

1 голос
/ 11 сентября 2011

Если вы не хотите «строить» URL-адрес и просто хотите получить полный путь к текущей странице, это поможет вам

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...