我正在Azure上构建一个ASP.NET,MVC5站点。我的网站混合了HTTP和HTTPS页面。我只使用HTTPS,但我需要嵌入一些不安全的第三方内容(twitch.tv流)。如果在HTTPS页面中提供服务,许多浏览器根本不会显示它(没有额外的,不总是直观的用户输入)。对于登录和帐户创建等内容来说,仅使用HTTP不是一个选项,原因很明显。
所以我跨越了两个世界,这很好,除了一个问题。我遇到的问题是发送与ActionLink
的链接,这些链接将这两个世界联系起来(即,从HTTP页面链接到HTTPS端点,反之亦然)。对于这些链接,我被迫使用带有协议参数的ActionLink
重载,并且该变体似乎输出内部端口号作为链接的一部分。
例如,如果我有:
@Html.ActionLink("MySite", "Index", "Home", new { area = "" }, new { @class = "navbar-brand" })
然后最后一个链接是“http://localhost”
但是,如果我有:
@Html.ActionLink("MySite", "Index", "Home", "http", null, null, new { area = "" }, new { @class = "navbar-brand" })
然后最后一个链接是“http://localhost:81”。此URL产生404。
我做了一些挖掘MVC源代码,似乎ActionLink最终调用UrlHelper.GenerateUrl
,最终从requestContext.HttpContext.Request.Url
读取。此URL包含Azure实例的内部端口,该端口将尽职地添加到函数发出的URL中。
ActionLink
或GenerateUrl
如何知道requestContext实际上包含无法访问的URL?很好的问题,我没有一个好的答案。
我在这一点上得出的结论是,协议过载的ActionLink
根本不适合在Azure托管解决方案中使用。我只在本地运行它来测试时才重现这个错误(即当负载均衡器和Web应用程序都在同一台机器上运行时,意味着它们不能同时使用端口80)。但是,这对我来说已经足够了,我无法继续。
有没有办法让ActionLink
在这里工作?如果没有,没有它生成链接的正确方法是什么?