ASP.NET MVC: как создать работающий экземпляр UrlHelper? - PullRequest
15 голосов
/ 10 марта 2010

Я использую quartz.net для планирования регулярных событий в приложении asp.net mvc.

Запланированное задание должно вызывать сценарий уровня обслуживания, для которого требуется экземпляр UrlHelper (для создания URL-адресов на основе правильных маршрутов (via urlHelper.Action(..)) содержится в электронных письмах, которые будут отправлены службой).

Я не хочу жестко кодировать ссылки в электронных письмах - они должны быть разрешены с помощью urlhelper.

Задание:

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

Обратите внимание, что это не выполняется в конвейере MVC.Текущий запрос не обрабатывается, код запускается планировщиком Quartz в определенное время.

Как получить экземпляр UrlHelper, пригодный для использования в указанном месте?

Если онневозможно создать UrlHelper, другой вариант, который я вижу, - сделать задание «самостоятельным вызовом» действия контроллера, выполнив HTTP-запрос - при выполнении действия у меня, конечно, будет доступен экземпляр UrlHelper, - но это кажетсянемного хакерский для меня.

Ответы [ 4 ]

5 голосов
/ 24 марта 2010

Как насчет создания нового HttpContext для UrlHelpler, как в этом ответе :

1 голос
/ 10 марта 2010

Редактировать: Извините, я, наверное, неправильно прочитал вопрос.

Похоже, ваш планировщик (который я понятия не имею, как он работает) - это отдельный процесс, и вы хотите, чтобы UrlHelper помог генерировать действительные URL-адреса в вашем приложении MVC?

Вы можете попробовать написать обработчик в вашем приложении MVC, который будет работать в контексте вашего приложения, который создаст для вас URL-адрес и вернет его. Затем вы можете вызвать обработчик из вашего планировщика, чтобы получить любой URL-адрес, который вам нужен, на основе параметров, которые вы передаете. Таким образом, вашему планировщику просто нужно знать, где находится URL-адрес запроса вашего приложения MVC, а затем попросить его выполнить URL картирование для вас.

Надеюсь, это немного лучший ответ. Если я полностью уволен, дайте мне знать ... собирался удалить мой ответ, но подумал, что сделаю еще один выстрел.

0 голосов
/ 05 марта 2012

Не забудьте указать параметр протокола при использовании метода UrlHelper.Action, это сгенерирует абсолютные URL . Пример:

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

или

url.Action("Action", "Controller", null, request.Url.Scheme)
0 голосов
/ 10 марта 2010

Вам нужно RequestContext, чтобы создать UrlHelper. В одном из моих методов расширения HtmlHelper я делаю это так:

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

Способ получения RequestContext зависит от вашего приложения.

...