Hola, Juan, me pasó algo parecido. Te cuento la solución que le di a ver si te vale (y me llevo la recompensa :)
Efectivamente lo que hago es coger cada link de la página y convertirlo a http, pero no a mano, si no recursivamente, utilizo esta función para buscar los controles
public static List<C> ControlesPorControl<C>(Control pControlContenedor) where C : Control
{
List<C> controles = new List<C>();
foreach (Control controlContenido in pControlContenedor.Controls)
{
if (controlContenido is C || controlContenido.GetType().IsSubclassOf(typeof(C)))
controles.Add((C)controlContenido);
if (controlContenido.Controls.Count > 0)
controles.AddRange(ControlesPorControl<C>(controlContenido));
}
return controles;
}
Luego en el prerender de la página maestra, si se ha marcado que para esa página hay que convertir a http
foreach (HtmlAnchor enlace in Utilidades.ControlesPorControl<HtmlAnchor>(this))
{
enlace.HRef = Utilidades.ResolverUrl(enlace.HRef);
}
foreach (ScriptReference script in this.ScriptManagerMaster.Scripts)
{
if (script.Path.ToLower().StartsWith("http:"))
script.Path = script.Path.ToLower().Replace("http", "https");
}
Y en utilidades la función para resolver las urls. Como ves la raiz la tomo de un parámetro de base de datos.
public static String ResolverUrl(String pUrlRelativa)
{
if (pUrlRelativa.ToLower().StartsWith(DatosParametros.UrlSitioBase.ToLower()))
return pUrlRelativa;
if (pUrlRelativa.StartsWith("~"))
return DatosParametros.UrlSitioBase + pUrlRelativa.Substring(1);
else
{
if (pUrlRelativa.StartsWith("/"))
return DatosParametros.UrlSitioBase + pUrlRelativa;
else
return DatosParametros.UrlSitioBase + "/" + pUrlRelativa;
}
}