如何在 MVC3 中使用 https 生成绝对 URL?

Posted

技术标签:

【中文标题】如何在 MVC3 中使用 https 生成绝对 URL?【英文标题】:How to Generate absolute urls with https in MVC3? 【发布时间】:2011-07-29 04:35:03 【问题描述】:

我正在使用 MVC3 并尝试从 https 提供内容,问题是当我调用 Url.Content 时,仍然使用相对 url 从 http 提供文件。我认为这个问题在 MVC3 中得到了解决,但我似乎找不到任何解决方案。有谁知道这个问题是否在 MVC3 中固有地解决了以及如何完成它,还是我需要创建自己的帮助方法来生成基于协议的绝对 URL?

【问题讨论】:

以下解决方案都很好用,但我想指出,如果您处于负载平衡的环境中,那么所有关于将生成什么 URL 的赌注都没有。 【参考方案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 或其他。

正如 Khalid 在 cmets 中指出的那样,类似的扩展方法已经在各种开源项目中可用,您可以使用它们(在许可允许的情况下)。一个例子可以在here找到。

【讨论】:

您的建议与 Mike Hadlow 的建议非常相似。 google.com/codesearch/p?hl=en#MEucUyOL2vo/trunk/Suteki.Shop/… 我以前没见过,将更新答案以添加指向该链接的链接。谢谢。 看起来这也值得为 Url.ContentAbsolute 或类似方法创建一个方法,而不是每次都需要包装它们 Google 代码搜索链接已损坏。 我将您的代码与这个答案结合起来:***.com/questions/2069922/… 以提供完整、绝对的网址。谢谢【参考方案2】:

@BlackTigerX 建议的不使用扩展方法或硬编码协议的解决方案:

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

按照以下文章中的建议:http://captaincodeman.com/2010/02/03/absolute-urls-using-mvc-without-extension-methods/

【讨论】:

这正是我想要的。我的目标是编写我的组件,以便可以将其部署到 http 或 https 环境而无需更改,这让我可以做到。【参考方案3】:

你可以使用Url.RouteUrl,一些重载带有协议参数,看起来像这样:

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

看看重载,看看你可以使用哪个

【讨论】:

【参考方案4】:

如果您不想“构建” url 而只想要当前页面的完整路径,这将解决问题

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

我知道它不像扩展方法那么优雅,但我想出于教育目的分享它

【讨论】:

以上是关于如何在 MVC3 中使用 https 生成绝对 URL?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 VIEW MVC3 Razor 中显示 webforms 页面 .aspx

如何在 ASP.NET MVC3 中通过 HTTPS 提供静态文件(在 ~/Content 中)

mvc3生成视图中元素和类的结构是啥原因

使用razor/asp.net mvc3生成静态html页面?

代理后面的TYPO3生成与http而不是https的绝对链接

在 MVC3 中,如何获取当前的动作名称?