Tengo algún tipo de programación de trabajo implementada que llama a una función ProcessJob. Ahora, dentro de este método, necesito generar URL para una de mis páginas, es decir, DoanloadPage.aspx? Some_params. Esa URL se envía al usuario por correo electrónico y cuando el usuario hace clic en ese enlace, lo llevará a la página.

El problema aquí es que no estoy generando URL en un método de solicitud web o no tengo acceso al objeto Solicitud. La URL debe generarse en una clase personalizada que esté enhebrada, es decir, no en una solicitud web.

Entonces no puedo ir con estas soluciones:

HostingEnvironment.MapPath("test.aspx");
VirtualPathUtility.ToAbsolute("123.aspx");
HttpContext.Current.Request.Url.Authority;

Ninguno de estos funciona porque creo que todos dependen de la solicitud o sesión actual de alguna manera. Entonces, ¿cómo puedo generar URL para mi aplicación dentro de mi código para poder usarlas de la forma que quiera?

6
Waleed 14 sep. 2018 a las 16:29

3 respuestas

La mejor respuesta

Si su método no puede usar HttpContext.Current.Request.Url, por ejemplo, en caso de que sea una tarea programada en segundo plano, puede usar cualquiera de las siguientes opciones:

  • En caso de que su código esté alojado en la misma aplicación ASP.NET, puede pasar el nombre de dominio del sitio a su clase, en la primera solicitud. Para hacerlo, debe manejar el evento Application_BeginRequest y obtener el dominio de HttpContext.Current.Request.Url y luego pasarlo a su clase, o almacenarlo en un almacenamiento de alcance de aplicación. Puede encontrar una implementación en esta publicación o en el original artículo.
    Nota: el código está disponible en SO, así que no repito el código aquí.

  • Si su código no está alojado en la misma aplicación ASP.NET o si por alguna razón no desea confiar en Application_BeginRequest, como otra opción, puede almacenar el nombre de dominio del sitio en una configuración (como appsettigs en la aplicación .condig o web.config si es una aplicación web) y úsela en su código.

4
Reza Aghaei 17 sep. 2018 a las 17:09

Mi respuesta es: no hagas esto. Está creando un sistema distribuido, aunque sea simple, y en general es problemático introducir el acoplamiento entre servicios en un sistema distribuido. Entonces, aunque es posible sembrar su dominio usando Application_BeginRequest, está vinculando el comportamiento de su trabajo por lotes a su sitio web. Con esta disposición, corre el riesgo de propagar errores y complica la implementación de su sistema.

Una mejor manera de ver este problema es darse cuenta de que el deseo principal es sincronizar el enlace de su sitio de producción con la URL que se utiliza en su trabajo por lotes. En muchos casos, una entrada en la configuración de la aplicación de su lote sería la mejor solución, realmente no hay necesidad de introducir código a menos que sepa que su URL cambiará con frecuencia o tendrá que escalar a muchas URL arbitrarias diferentes . Si necesita admitir el cambio de la URL mediante programación, le recomiendo que busque configurar un sistema de configuración distribuida como Consul y lea las URL actuales de su sistema de implementación para el enlace IIS y el archivo app.config para su lote. Entonces, incluso en este escenario avanzado, no hay interacción directa entre su lote y su sitio web.

0
Paul Keister 23 sep. 2018 a las 16:02

Puedes hacer algo como esto. Dns.GetHostName devolverá el nombre de la computadora que aloja el sitio. Puede usar eso para verificar si el sitio está en un servidor de desarrollo.

string domain = "www.productionurl/123.aspx";

if (Dns.GetHostName() == "Development")
{
    domain = "www.developmenturl/123.aspx";
}

Dns.GetHostName() no es la única forma de verificar. También puedes usar HostingEnvironment.ApplicationPhysicalPath. También puede verificar eso y ver si la ruta es la del servidor de desarrollo.

0
VDWWD 20 sep. 2018 a las 07:26