Я использую MVC3 и пытаюсь обслуживать контент из https, проблема в том, что когда я вызываю Url.Content, файлы по-прежнему обслуживаются с http с использованием относительного URL-адреса. Я думал, что эта проблема была рассмотрена в MVC3, но я не могу найти никакого решения. Кто-нибудь знает, если эта проблема по сути решена в MVC3 и как ее выполнить, или мне нужно создать свои собственные вспомогательные методы для генерации абсолютных Urls на основе протокола?
Как создать абсолютные URL-адреса с помощью https в MVC3?
Ответ 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 или что-то еще.
Как отмечает Халид в комментариях, подобные методы расширения уже доступны в различных проектах с открытым исходным кодом, которые вы можете использовать (учитывая, что разрешена лицензия). Пример можно найти здесь.
Ответ 2
Решение, которое не использует методы расширения или жесткий код протокола, как предлагается @BlackTigerX:
Url.RouteUrl("Default", new { Action = "About" }, Request.Url.Scheme)
как предложено в следующей статье: http://captaincodeman.com/2010/02/03/absolute-urls-using-mvc-without-extension-methods/
Ответ 3
Вы можете использовать Url.RouteUrl, некоторые из перегрузок принимают параметр протокола, выглядит примерно так:
Url.RouteUrl("Product", new { itemId = "123456" }, "https");
Взгляните на перегрузки и посмотрите, какой из них вы можете использовать
Ответ 4
Если вы не хотите "строить" URL-адрес и просто хотите полный путь к текущей странице, это сделает трюк
Context.Server.UrlEncode(Context.Request.Url.AbsoluteUri)
Я знаю, что это не так элегантно, как метод расширения, но подумал об обмене его в образовательных целях