2013-02-13 6 views
5

Ich habe eine Anwendung mvc 3 mit einem Hintergrund Thread überprüft den Zustand einiger Datenbankelemente. Wenn es ein abgelaufenes Objekt findet, sendet es eine E-Mail. In der E-Mail möchte ich die URL für die anzurufende Aktion einfügen, um den Status zu sehen. Wenn diese von einem Controller geschehen würde ich den UrlHelper verwenden, zB:Generieren einer URL unabhängig von Controllern in ASP.NET MVC 3

string body_url = "For more details see: " + Url.Action("Details", "MyOrder", new { OrderId = order.OrderId }, Constants.HttpProtocol); 

Aber ich bin nicht in einem Controller, noch ist meine Methode von einem Controller bezeichnet wird, wird es beim Start der Anwendung gestartet. Gibt es eine Möglichkeit, einen gültigen UrlHelper zu generieren, oder, wenn nicht, eine gültige URL zu generieren, ohne auf Festcodierungswege zurückzugreifen, wenn unabhängig von den Controllern?

Antwort

4

Dieser theoretische ist ... ref msdn und so ... auf einem Hintergrund-Thread zu sein macht die Dinge interessant :)

var request = new HttpRequest("/", "http://example.com", ""); //hopefully you can hardcode this or pull from config? 
var response = new HttpResponse(new StringWriter()); 
var httpContext = new HttpContext(request, response); 

var httpContextBase = new HttpContextWrapper(httpContext); 
var routeData = new RouteData(); 
var requestContext = new RequestContext(httpContextBase, routeData); 

var urlHelper = new UrlHelper(requestContext); 
var url = urlHelper.Action("ActionName", "ControllerName"); 
+0

Es scheint eine Schande, hart-Code, die Basis-URL, um es vor allem angesichts kann sich ändern, je nachdem, ob ich Test oder Produktion betreibe. Ich hätte gehofft, dass es eine Möglichkeit gäbe, die Basis-URL aus der App zu holen. –

+0

Sie können die HttpContext.Current-Informationen in Ihren Hintergrund-Thread übergeben, wenn Sie es hochfahren. Achten Sie darauf, nur den Basis-URL-Teil davon zu verwenden! http://stackoverflow.com/questions/3398717/asp-net-get-websites-url-without-httpcontext-current-running-in-background-t – felickz

+0

'HttpContext.Current' ist nicht verfügbar beim Start der Anwendung, die ist, wenn @SimonParker in der Lage sein soll, eine Routen-URL zu generieren. –