c# - current - obtener pagina actual asp net
Obtener url original sin puerto no estándar(C#) (6)
Algo como
String port = Request.ServerVariables["SERVER_PORT"] == "80" ? "" : ":" + Request.ServerVariables["SERVER_PORT"];
String virtualRoot = Url.Content("~/");
destinationUrl = String.Format("http://{0}{1}{2}", Request.ServerVariables["SERVER_NAME"], port + virtualRoot, "/callback");
¡Primera pregunta!
Ambiente
MVC, C #, AppHarbor.
Problema
Estoy llamando a un proveedor de openid y estoy generando una url de devolución de llamada absoluta basada en el dominio.
En mi máquina local, esto funciona bien si presiono http://localhost:12345/login
Request.Url; //gives me `http://localhost:12345/callback`
Sin embargo, en AppHarbor donde estoy implementando, porque están usando puertos no estándar, incluso si lo encuentro en " http://sub.example.com/login "
Request.Url; //gives me http://sub.example.com:15232/callback
¡Y esto complica mi devolución de llamada, porque el número de puerto no estaba en la URL de origen original!
He intentado
- Solicitud.Url
- Request.Url.OriginalString
- Solicitud.RawUrl
Todo me da " http://sub.example.com:15232/callback ".
También para aclarar que esto no es un problema de Realm, el mensaje de error que recibo de DotNetOpenAuth es
''http://sub.example.com:14107/accounts/openidcallback'' not under realm ''http://*.example.com/''.
No creo que haya rellenado eso?
Ahora, estoy a punto de considerar algunas cosas piratas como
- comandos del preprocesador (#IF DEBUG THEN PUT PORT)
- cadena reemplazar (Request.URL.Contains ("localhost"))
Todas estas no son soluciones al 100%, pero estoy harta de reflexionar sobre lo que podría ser una propiedad simple que me estoy perdiendo. También he leído this pero eso no parece tener una respuesta aceptada (y se trata más del camino que de la autoridad). Así que lo estoy poniendo hacia ustedes, chicos.
Resumen
Así que si tuviera http://localhost:12345/login
, necesito obtener http://localhost:12345/callback
del contexto de Solicitud.
Y si tuviera " http://sub.example.com/login ", debería obtener " http://sub.example.com/callback ", independientemente del puerto en el que esté.
¡Gracias! (Hora de dormir, responderemos a cualquier pregunta por la mañana)
Este es un problema común en las configuraciones de carga equilibrada como las de AppHarbor: hemos proporcionado un ejemplo de solución .
Actualización: una solución más deseable para muchas aplicaciones ASP.NET puede ser configurar aspnet:UseHostHeaderForRequestUrl
appSetting en true
. Nosotros (AppHarbor) hemos visto que varios clientes experimentan problemas al usarlo con sus aplicaciones WCF, por lo que no lo hemos habilitado de forma predeterminada y aún recomendamos la solución anterior para esas situaciones. Puede configurarlo utilizando las "Variables de configuración" de AppHarbor para inyectar los ajustes de configuración cuando se implementen. Más información se puede encontrar en este artículo .
Mis pensamientos iniciales son obtener la variable de referencia y verificar si eso incluye un puerto; si es así, úselo, de lo contrario, no.
Si esa no es una opción porque un proxy puede eliminar la variable del encabezado de referencia, entonces es posible que necesite usar algún script del lado del cliente para obtener la ubicación y devolverla al servidor.
Supongo que AppHarbor utiliza el reenvío de puertos al servidor IIS, por lo que, aunque públicamente el sitio está en el puerto 80, IIS lo tiene alojado en otro puerto, por lo que no puede saber a qué puerto se conectó el cliente.
Recientemente me encontré con un problema en el que comparé una URL con la URL actual, y luego resalté la navegación basada en eso. Funcionó localmente, pero no en producción.
Tenía http://example.com/path/to/file.aspx
como mi archivo, pero al ver ese archivo y ejecutar Request.Url.ToString()
produjo https://example.com:81/path/to/file.aspx
en un entorno de producción de carga equilibrada.
Ahora estoy usando Request.Url.AbsolutePath
para simplemente darme /path/to/file.aspx
, ignorando el esquema, el nombre de host y los números de puerto.
Cuando necesito compararlo con la URL en cada elemento de navegación que utilicé: New Uri(theLink.Href).AbsolutePath
Si usa la clase UrlBuilder en el marco, puede solucionar esto fácilmente. En la clase de constructor, si establece el puerto en -1, se eliminará el número de puerto:
new UriBuilder("http://sub.example.com:15232/callback"){ Port = -1}
devuelve: http://sub.example.com/callback
Para mantener el número de puerto en una máquina local, simplemente verifique Request.IsLocal y no aplique -1 al puerto.
Yo envolvería esto en un método de extensión para mantenerlo limpio.
Veo que este es un hilo viejo. Tuve este problema al ejecutar MVC5, en IIS 7.5, con un proxy Apache al frente. Fuera del servidor, obtendría "Respuesta vacía", ya que la aplicación asp.net obtiene la URL de apache con el puerto personalizado.
Para que la aplicación redirija a una ruta secundaria sin incluir el puerto "personalizado", olvide los objetos Respuesta / Solicitud y use el método de Transferencia. Por ejemplo, si quiero que los usuarios sean redirigidos automáticamente a la página de inicio de sesión en caso de que todavía no hayan iniciado sesión:
if (!User.Identity.IsAuthenticated)
Server.TransferRequest("Account/Login");