Cuando se desea generar URL de su capa de lógica de negocios, no tiene la flexibilidad de usar la clase de página de formulario Web de ASP.NET/ResolveUrl de control (..) etc. Además, puede necesitar generar URL desde controlador ASP.NET MVC donde no solo se pierda el ResolveUrl del formulario web (..) método, pero tampoco puede obtener la acción Url.Action (..) aunque Url.Action solo toma el nombre del Controlador y la Acción, no la URL relativa.
He intentado utilizar
var uri = new Uri (absoluteUrl, URLrelativa)
enfoque, pero hay un problema también. Si la aplicación web está alojada en el directorio virtual de IIS, donde la URL de la aplicación es así: http://localhost/MyWebApplication1/
, y la URL relativa es "/ miPágina", la URL relativa se resuelve como "http://localhost/MyPage
", que es otro problema.
Por lo tanto, para superar estos problemas, he escrito una clase UrlUtils que puede funcionar desde una biblioteca de clases. Por lo tanto, no dependerá de la clase Page, pero depende de ASP.NET MVC. Entonces, si no le importa agregar una referencia a MVC dll a su proyecto de biblioteca de clase, entonces mi clase funcionará sin problemas. He probado en el escenario del directorio virtual de IIS donde la URL de la aplicación web es así: http://localhost/MyWebApplication/MyPage
. Me di cuenta de que, a veces, debemos asegurarnos de que la URL absoluta sea URL url o no SSL. Entonces, escribí la biblioteca de mi clase apoyando esta opción. He restringido esta biblioteca de clases para que la URL relativa pueda ser url absoluta o una URL relativa que comience con '~ /'.
El uso de esta biblioteca, puedo llamar
string absoluteUrl = UrlUtils.MapUrl("~/Contact");
Devuelve: http://localhost/Contact
cuando la URL de la página es: http://localhost/Home/About
devuelve: http://localhost/MyWebApplication/Contact
cuando la URL de la página es: http://localhost/MyWebApplication/Home/About
string absoluteUrl = UrlUtils.MapUrl("~/Contact", UrlUtils.UrlMapOptions.AlwaysSSL);
Devoluciones: **https**://localhost/MyWebApplication/Contact
cuando la URL de la página es: http://localhost/MyWebApplication/Home/About
Aquí está mi biblioteca de clases:
public class UrlUtils
{
public enum UrlMapOptions
{
AlwaysNonSSL,
AlwaysSSL,
BasedOnCurrentScheme
}
public static string MapUrl(string relativeUrl, UrlMapOptions option = UrlMapOptions.BasedOnCurrentScheme)
{
if (relativeUrl.StartsWith("http://", StringComparison.OrdinalIgnoreCase) ||
relativeUrl.StartsWith("https://", StringComparison.OrdinalIgnoreCase))
return relativeUrl;
if (!relativeUrl.StartsWith("~/"))
throw new Exception("The relative url must start with ~/");
UrlHelper theHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);
string theAbsoluteUrl = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) +
theHelper.Content(relativeUrl);
switch (option)
{
case UrlMapOptions.AlwaysNonSSL:
{
return theAbsoluteUrl.StartsWith("https://", StringComparison.OrdinalIgnoreCase)
? string.Format("http://{0}", theAbsoluteUrl.Remove(0, 8))
: theAbsoluteUrl;
}
case UrlMapOptions.AlwaysSSL:
{
return theAbsoluteUrl.StartsWith("https://", StringComparison.OrdinalIgnoreCase)
? theAbsoluteUrl
: string.Format("https://{0}", theAbsoluteUrl.Remove(0, 7));
}
}
return theAbsoluteUrl;
}
}
Una pequeña sugerencia para su código. Debería usar String.Format en lugar de concatenar los bits de URL al final. – Bernd