Я использую quartz.net для планирования регулярных событий в рамках asp.net mvc приложение.
Запланированное задание должно назвать сценарий уровня служб, который требует экземпляра UrlHelper (для создания URL на основе правильных маршрутов (via urlHelper.Action(..)
) содержавшийся в электронных письмах, которые будут посланы сервисом).
Я не хочу к hardcode ссылки в электронные письма - они должны быть разрешены с помощью urlhelper.
Задание:
public class EvaluateRequestsJob : Quartz.IJob
{
public void Execute(JobExecutionContext context)
{
// where to get a usable urlHelper instance?
ServiceFactory.GetRequestService(urlHelper).RunEvaluation();
}
}
Обратите внимание на то, что это не выполняется в конвейере MVC. Нет никакого текущего подаваемого запроса, код выполняется Кварцевым планировщиком в определенные времена.
Как я получаю экземпляр UrlHelper, применимый на обозначенном месте?
Если не возможно создать UrlHelper, другая опция, которую я вижу, состоит в том, чтобы заставить задание "самоназвать" действие контроллера путем выполнения Запроса HTTP - при выполнении действия, я буду, конечно, иметь экземпляр UrlHelper в наличии - но это кажется небольшим hacky мне.
Как насчет того, чтобы просто создать новый HttpContext для UrlHelpler, как в этом ответе :
Вам нужен RequestContext
для создания UrlHelper. В одном из моих методов расширения HtmlHelper я делаю это так:
public static string ScriptUrl(this HtmlHelper html, string script)
{
var url = new UrlHelper(html.ViewContext.RequestContext);
...
}
Как вы получаете RequestContext
, зависит от вашего приложения.
Редактировать: Извините, я неправильно прочитал вопрос.
Похоже, ваш планировщик (я понятия не имею, как он работает) - это отдельный процесс, и вы хотите, чтобы UrlHelper помогал генерировать действительные URL-адреса в вашем приложении MVC?
Вы можете попробовать написать обработчик в своем приложении MVC, который будет работать в контексте вашего приложения, который создаст для вас URL-адрес и вернет его. Затем вы можете вызвать обработчик из своего планировщика, чтобы получить любой URL-адрес, который вам нужен, на основе переданных вами параметров. Таким образом, ваш планировщик просто должен знать, где находится URL-адрес запроса вашего приложения MVC, а затем может попросить его сделать URL-адрес отображение для вас.
Надеюсь, это немного лучший ответ. Если я полностью отключен, дайте мне знать ... собирался удалить свой ответ, но подумал, что дам ему еще один шанс.