2010-03-09 7 views
15

Sto usando quartz.net per pianificare eventi regolari all'interno dell'applicazione asp.net mvc.ASP.NET MVC: come creare un'istanza UrlHelper utilizzabile?

Il processo pianificato deve chiamare uno script del livello di servizio che richiede un'istanza UrlHelper (per la creazione di URL in base ai percorsi corretti (via urlHelper.Action(..)) contenuti nelle e-mail che verranno inviate dal servizio).

Io non voglio hardcode i link nelle email - dovrebbero essere risolti utilizzando l'UrlHelper.

Il lavoro:

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

Si prega di notare che questo non viene eseguito all'interno della tubazione MVC. Non viene fornita alcuna richiesta corrente, il codice viene eseguito dallo scheduler Quartz a orari definiti.

Come è possibile ottenere un'istanza UrlHelper utilizzabile nel luogo indicato?

Se non è possibile costruire un'UrlHelper, l'altra opzione che vedo è quello di rendere il lavoro "auto-call" un'azione di controllo facendo una richiesta HTTP - durante l'esecuzione l'azione che sarà ovviamente hanno un'istanza UrlHelper disponibile - ma questo mi sembra un po 'hacky.

+1

Wow i voti negativi stanno volando su questa discussione :) – Kelsey

+0

@Kelsey forse è perché la questione sembra essere troppo banale così le persone tendono a dare banale o irrilevante le risposte o la domanda richiede almeno una conoscenza di base del framework non così noto (quarzo) – Marek

+0

Questo programma di pianificazione del quarzo usa qualcosa di simile al metodo con cui Jeff ha scritto un post: http://blog.stackoverflow.com/2008/07/ easy-background-tasks-in-aspnet /? – Kelsey

risposta

5

ne dite solo la creazione di un nuovo HttpContext per l'UrlHelpler come in questo answer:

+0

Nel frattempo ho usato un approccio diverso, ma questo sembra che funzioni, anche se è un po 'hacky. Grazie per aver trovato la risposta :) – Marek

+0

@Marek - Come hai risolto il tuo problema? Sto avendo problemi simili in cui ho bisogno di HttpContext per eseguire il rendering di una vista mentre utilizzo quella vista per inviare una e-mail quando il quarzo è terminato. – chobo2

+0

@chobo - Ho finito per creare un'app esterna che esegue richieste HTTP ricorrenti e implementato la logica nelle azioni del controller. – Marek

1

Modifica: Mi dispiace, ho completamente letto male la domanda.

Sembra che il programmatore (che non ho idea di come funziona) è un processo separato e si desidera che l'UrlHelper per contribuire a generare URL validi nel MVC app?

Si potrebbe provare a scrivere un gestore nell'app MVC che verrà eseguito nel contesto delle applicazioni che creerà l'URL e lo restituirà. È quindi possibile chiamare il gestore dal scheduler per ottenere qualsiasi URL è necessario in base alle params si passa. In questo modo il programmatore ha solo bisogno di conoscere in cui l'URL di query del MVC app è e quindi può chiedere di fare l'URL mappatura per te.

Spero che questo è un po 'meglio di una risposta. Se sono completamente fuori fammi sapere ... stava per cancellare la mia risposta, ma ho pensato di dargli un altro colpo.

+0

grazie, l'idea di avere un solo URL ben noto "hardcoded" che fornisce le mappature dei percorsi richieste è interessante, anche se equivale a chiamare un'azione che licenzierà il servizio di valutazione con una richiesta HTTP. annullare il mio downvote ora :) – Marek

+0

Ya Non riesco a pensare a nessun altro modo di farlo perché la tua app MVC è davvero l'unica cosa che avrà accesso al contesto che ti serve. È un problema interessante che ho avuto a che fare con l'utilizzo di URL hardcoded in un file di configurazione in cui ho lasciato gli argomenti '{0}' per essere sostituiti in base agli ID. Non mi è mai piaciuta la soluzione, quindi sono interessato a vedere se c'è un modo migliore per farlo. – Kelsey

+0

Si noti che questo codice è ancora in esecuzione nell'app MVC, ma non serve alcuna richiesta. Se potessi acquisire * qualsiasi * richiesta e memorizzare l'istanza di UrlHelper in un posto noto, il problema sarebbe risolto (sì, quello ha un forte odore) – Marek

-2

Hai bisogno di un RequestContext per creare un UrlHelper. In uno dei miei metodi di estensione HtmlHelper, lo faccio in questo modo:

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

come si ottiene il RequestContext dipende dalla vostra applicazione.

+0

Potresti specificare come posso ottenere HttpContext nell'esempio che ho pubblicato? Il problema sembra essere equivalente al mio problema originale: non sono all'interno della pipeline di elaborazione delle richieste MVC, il lavoro pianificato viene chiamato dallo scheduler Quartz. – Marek

+0

Fuori dalla pipeline MVC, non ne sono sicuro. Probabilmente dovresti impostare manualmente i tuoi percorsi, ecc., Poiché il framework non sta facendo nulla per te. Probabilmente è possibile, ma non sembra valga la pena. –

0

Ricordatevi di specificare il parametro di protocollo quando si utilizza il metodo UrlHelper.Action, questo sarà generare URL assoluti.Esempio:

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

o

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