2010-03-09 12 views
15

Estoy usando quartz.net para programar eventos regulares dentro de la aplicación asp.net mvc.ASP.NET MVC: ¿Cómo crear una instancia utilizable de UrlHelper?

El trabajo programado debe llamar a un script de capa de servicio que requiere una instancia de UrlHelper (para crear Urls en función de las rutas correctas (via urlHelper.Action(..)) contenidas en los correos electrónicos que enviará el servicio).

No quiero codificar los enlaces en los correos electrónicos, deben resolverse usando el urlhelper.

El trabajo:

public class EvaluateRequestsJob : Quartz.IJob 
{ 
    public void Execute(JobExecutionContext context) 
    { 
     // where to get a usable urlHelper instance? 
     ServiceFactory.GetRequestService(urlHelper).RunEvaluation(); 
    } 
} 

Tenga en cuenta que esto no se ejecuta dentro de la tubería MVC. No se está atendiendo ninguna solicitud actual, el programador de Quartz ejecuta el código en momentos definidos.

¿Cómo puedo obtener una instancia de UrlHelper utilizable en el lugar indicado?

Si no es posible construir un UrlHelper, la otra opción que veo es hacer que el trabajo "auto-llame" sea una acción del controlador haciendo una solicitud HTTP, mientras ejecuto la acción tendré una instancia de UrlHelper disponible, pero esto me parece un poco raro.

+1

Wow los votos negativos están volando hacia fuera en este hilo :) – Kelsey

+0

@Kelsey tal vez es debido a que la cuestión parece ser demasiado trivial para que las personas tienden a dar trivial o irrelevante las respuestas o la pregunta requieren al menos conocimiento básico de un marco no tan conocido (cuarzo) – Marek

+0

¿Utiliza este programador de cuarzo algo similar al método en el que Jeff hizo una publicación en: http://blog.stackoverflow.com/2008/07/ easy-background-tasks-in-aspnet /? – Kelsey

Respuesta

5

¿Qué tal sólo la creación de un nuevo HttpContext para la UrlHelpler como en este answer:

+0

Mientras tanto, he usado un enfoque diferente, pero este parece que puede funcionar, incluso si es un poco hacky. Gracias por encontrar la respuesta :) – Marek

+0

@Marek - ¿Cómo resolvió su problema? Estoy teniendo un problema similar cuando necesito HttpContext para representar una vista, ya que utilizo esa vista para enviar un correo electrónico una vez que se realiza el cuarzo. – chobo2

+0

@chobo - Terminé creando una aplicación externa que realiza solicitudes HTTP recurrentes e implementa la lógica en las acciones del controlador. – Marek

1

Edit: Lo siento, he malinterpretado totalmente la pregunta, supongo.

Parece que su programador (que no tengo ni idea de cómo funciona) es un proceso independiente y desea que el UrlHelper ayude a generar URL válidas en su aplicación MVC.

Puede intentar escribir un controlador en su aplicación MVC que se ejecutará en su contexto de aplicaciones que construirá la URL para usted y la devolverá. Luego, puede llamar al controlador desde su planificador para obtener cualquier URL que necesite en función de los parámetros que ingrese. De esta manera, su planificador solo necesita saber dónde está la URL de consulta de su aplicación MVC y luego puede solicitarle que haga la URL. mapeo para usted

Espero que esto sea un poco mejor de una respuesta. Si estoy totalmente fuera de, hágamelo saber ... iba a eliminar mi respuesta, pero pensé que le daría una oportunidad más.

+0

gracias, la idea de tener una única URL conocida "codificada" que proporcione las asignaciones de ruta requeridas es interesante, incluso si es equivalente a llamar a una acción que activará el servicio de evaluación con una solicitud HTTP. deshaciendo mi voto ahora :) – Marek

+0

Ya no puedo pensar en otra forma de hacerlo porque tu aplicación MVC es realmente lo único que va a tener acceso al contexto que necesitas. Es un problema interesante que he estado utilizando con las URL codificadas en un archivo de configuración donde dejo argumentos '{0}' para ser sustituidos en base a los ID. Nunca me gustó la solución, así que estoy interesado en ver si hay una mejor manera de hacerlo. – Kelsey

+0

Tenga en cuenta que este código todavía se está ejecutando dentro de la aplicación MVC, pero no sirve ninguna solicitud. SI pudiera capturar * cualquier * solicitud y almacenar la instancia de UrlHelper en un lugar conocido, el problema se resolvería (sí, eso huele mucho) – Marek

-2

Necesita un RequestContext para crear un UrlHelper. En uno de mis métodos de extensión HtmlHelper, lo hago de esta manera:

public static string ScriptUrl(this HtmlHelper html, string script) 
{ 
    var url = new UrlHelper(html.ViewContext.RequestContext); 
    ... 
} 

cómo obtener la RequestContext depende de su aplicación.

+0

¿Podría especificar cómo obtengo el HttpContext en el ejemplo que publiqué? El problema parece ser equivalente a mi problema original: no estoy dentro de la canalización de procesamiento de solicitud de MVC, el trabajo programado se llama desde el programador de Quartz. – Marek

+0

Fuera de la tubería de MVC, no estoy seguro. Probablemente necesites configurar manualmente tus rutas, etc., ya que el framework no está haciendo nada de eso por ti. Probablemente sea posible, pero no suena digno de la molestia. –

0

recuerde especificar el parámetro de protocolo cuando se utiliza el método UrlHelper.Action, esto va a generar URL absoluta .Ejemplo:

url.Action("Action", "Controller", null, "http") 

o

url.Action("Action", "Controller", null, request.Url.Scheme) 
Cuestiones relacionadas