2010-03-09 10 views
15

Ich benutze quartz.net, um regelmäßige Ereignisse innerhalb asp.net mvc-Anwendung zu planen.ASP.NET MVC: Wie erstellt man eine verwendbare UrlHelper-Instanz?

Der geplante Job sollte ein Service-Layer-Skript aufrufen, das eine UrlHelper-Instanz benötigt (zum Erstellen von URLs basierend auf korrekten Routen (via urlHelper.Action(..)) in E-Mails, die vom Service gesendet werden).

Ich möchte nicht die Links in die E-Mails hartcodieren - sie sollten mit dem URL-Helper gelöst werden.

Der Job:

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

Bitte beachten Sie, dass diese nicht in der MVC-Pipeline ausgeführt wird. Es wird keine aktuelle Anfrage gesendet, der Code wird zu bestimmten Zeiten vom Quartz-Scheduler ausgeführt.

Wie kann ich eine UrlHelper-Instanz an der angegebenen Stelle verwenden?

Wenn es nicht möglich ist, einen UrlHelper zu konstruieren, ist die andere Option, den Job als "Selbstaufruf" zu einer Controller-Aktion zu machen, indem ich eine HTTP-Anfrage mache - während ich die Aktion ausführe, habe ich natürlich eine UrlHelper-Instanz verfügbar - aber das scheint ein bisschen hacky für mich.

+1

Wow die negativen Stimmen fliegen auf diesen Thread aus :) – Kelsey

+0

@Kelsey vielleicht ist es, weil die Frage zu trivial zu sein scheint, so dass die Leute trivial oder irrelevant geben neigen Antworten oder die Frage erfordert mindestens Grundkenntnisse des nicht so gut bekannten Rahmenwerks (Quarz) – Marek

+0

Verwendet dieser Quartz-Scheduler etwas ähnliches wie die Methode, die Jeff einen Beitrag gemacht hat: http://blog.stackoverflow.com/2008/07/ Easy-Hintergrund-Aufgaben-in-Aspnet /? – Kelsey

Antwort

5

Wie wäre es gerade ein neues Httpcontext für die UrlHelpler wie in diesem answer erstellen:

+0

Inzwischen habe ich einen anderen Ansatz verwendet, aber dieser scheint zu funktionieren, auch wenn es ein bisschen hacky ist. Danke, dass du die Antwort gefunden hast :) – Marek

+0

@Marek - Wie hast du dein Problem gelöst? Ich habe ähnliches Problem, wo ich HttpContext benötige, um eine Ansicht zu rendern, wenn ich diese Ansicht verwende, um eine E-Mail zu senden, sobald der Quarz fertig ist. – chobo2

+0

@chobo - Ich habe schließlich eine externe App erstellt, die wiederkehrende HTTP-Anfragen ausführt und die Logik in Controller-Aktionen implementiert. – Marek

1

Edit: Sorry, ich habe die Frage total falsch gelesen, denke ich.

Es klingt wie Ihr Scheduler (was ich nicht weiß, wie es funktioniert) ist ein separater Prozess und Sie möchten, dass der UrlHelper hilft, gültige URLs in Ihrer MVC App zu generieren?

Sie könnten versuchen, einen Handler in Ihre MVC-App zu schreiben, der unter Ihrem Anwendungskontext ausgeführt wird, der die URL für Sie erstellt und zurückgibt. Sie können dann den Handler von Ihrem Scheduler aufrufen, um basierend auf den Parametern, die Sie übergeben, eine beliebige URL zu erhalten. Auf diese Weise muss Ihr Scheduler nur wissen, wo die Abfrage-URL Ihrer MVC-App ist und kann dann die URL anfordern Mapping für Sie.

Hoffe, das ist ein bisschen besser als eine Antwort. Wenn ich total frei bin, lass es mich wissen ... würde meine Antwort löschen, dachte aber, ich würde es noch einmal versuchen.

+0

danke, die Idee von Es ist interessant, nur eine einzige "fest codierte" bekannte URL zu haben, die die erforderlichen Routemappings bereitstellt - selbst wenn dies dem Aufruf einer Aktion entspricht, die den Evaluierungsdienst mit einer HTTP-Anforderung auslöst. Rückgängigmachen meines Downvotes jetzt :) – Marek

+0

Ich kann mir keine andere Möglichkeit vorstellen, es zu tun, weil Ihre MVC-App wirklich das einzige ist, das Zugriff auf den Kontext haben wird, den Sie brauchen. Es ist ein interessantes Problem, das ich mit der Verwendung von hartcodierten URLs in einer Konfigurationsdatei umgehen konnte, wobei ich '{0}' Argumente basierend auf IDs ersetzte. Mir hat die Lösung nie gefallen, deshalb bin ich daran interessiert zu sehen, ob es einen besseren Weg dafür gibt. – Kelsey

+0

Bitte beachten Sie, dass dieser Code immer noch in der MVC-App läuft - aber keine Anfragen bedient. WENN ich * any * Anfrage erfassen und die UrlHelper-Instanz an einem bekannten Ort speichern könnte, wäre das Problem gelöst (ja, das riecht viel) – Marek

-2

Sie benötigen einen RequestContext, um einen UrlHelper zu erstellen. In einem meiner Htmlhelper-Erweiterungsmethoden, ich mache es wie folgt aus:

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

Wie bekommt man die RequestContext auf Ihrer Anwendung abhängig ist.

+0

Könnten Sie bitte angeben, wie bekomme ich den HttpContext in dem Beispiel, das ich gepostet habe? Das Problem scheint meinem ursprünglichen Problem zu entsprechen - ich bin nicht in der MVC-Anforderungsverarbeitungs-Pipeline, der geplante Job wird vom Quartz-Scheduler aufgerufen. – Marek

+0

Außerhalb der MVC-Pipeline bin ich mir nicht sicher. Sie müssten wahrscheinlich Ihre Routen usw. manuell einrichten, da das Framework Ihnen das nicht abnimmt. Es ist wahrscheinlich möglich, aber klingt nicht die Mühe wert. –

0

Denken Sie daran, das Protokoll Parameter angeben, wenn UrlHelper.Action Methode verwenden, wird diese absolute Urls erzeugen.Beispiel:

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

oder

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