2011-04-04 8 views
18

Estoy utilizando MVC3 y estoy intentando servir contenido desde https, el problema es que cuando llamo a Url.Content los archivos todavía se sirven desde http usando una URL relativa. Pensé que este problema fue abordado en MVC3, pero parece que no puedo encontrar ninguna solución. ¿Alguien sabe si este problema se resuelve inherentemente en MVC3 y cómo lograrlo o tengo que crear mis propios métodos de ayuda para generar Urls absolutas basadas en el protocolo?Cómo generar direcciones URL absolutas con https en MVC3?

+0

Las soluciones a continuación funcionan todas muy bien, pero quiero señalar que si se encuentra en un entorno de carga equilibrada, entonces todas las apuestas están apagadas en cuanto a qué URL se generará. –

Respuesta

28

Probablemente pueda implementar su propia solución usando VirtualPathUtility.ToAbsolute. Probablemente algo como esto:

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); 
    } 
} 

la que se usaría como:

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

(no hemos probado esto por mí mismo, no dude en jugar alrededor para hacer que funcione bien.)

Este te ayuda a generar URL absolutas para tus archivos de contenido. Para cambiar el esquema de las URL resultantes, puede crear un método de extensión adicional que manipule el esquema de las URL determinadas para que sean HTTPS u otra cosa.

Como señala Khalid en los comentarios, ya hay disponibles métodos de extensión similares en varios proyectos de código abierto que puede utilizar (dado que la licencia lo permite). Un ejemplo uno se puede encontrar here.

+0

Su sugerencia es muy similar a esto de Mike Hadlow. http://www.google.com/codesearch/p?hl=en#MEucUyOL2vo/trunk/Suteki.Shop/Suteki.Common/Extensions/UrlExtensionsHelper.cs&q=SSL%20package:http://sutekishop%5C.googlecode% 5C.com & d = 4 –

+0

No había visto eso antes, actualizaré la respuesta para agregar un enlace a eso. Gracias. – paracycle

+2

Parece que esto también valdría la pena crear un método para Url.ContentAbsolute o similar en lugar de tener que envolverlos cada vez –

10

Puede utilizar Url.RouteUrl, algunas de las sobrecargas echar un parámetro de protocolo, se ve algo como esto:

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

echar un vistazo a las sobrecargas y ver que uno puede utilizar

1

Si usted no quiere "construir" la url y sólo desea la ruta completa de la página actual, esto va a hacer el truco

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

sé que no es tan elegante como un método de extensión, pero pensó de compartirlo con fines educativos

15

Una solución que no utiliza métodos de extensión o codificar el protocolo, según lo sugerido por @BlackTigerX:

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

como se sugiere en el siguiente artículo: http://captaincodeman.com/2010/02/03/absolute-urls-using-mvc-without-extension-methods/

+1

+1 con demasiada frecuencia verá protocolos codificados en estas soluciones ... – Tr1stan

+0

Justo lo que ordenó el dr. – neizan

+0

Esto es exactamente lo que estaba buscando.Mi objetivo era escribir mi componente para que se pudiera implementar en entornos http o https sin cambios, y esto me permitió hacerlo. –

Cuestiones relacionadas