Ответ 1
Как просто создать новый HttpContext для UrlHelpler, как в этом answer:
Я использую quartz.net для планирования регулярных событий в приложении asp.net mvc.
Запланированное задание должно вызывать сервисный уровень script, для которого требуется экземпляр UrlHelper (для создания Urls на основе правильных маршрутов (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 - но это кажется мне немного взломанным.
Как просто создать новый HttpContext для UrlHelpler, как в этом answer:
Изменить: Извините, я совершенно неправильно читаю вопрос, который, я думаю.
Похоже, ваш планировщик (который я понятия не имею, как он работает) является отдельным процессом, и вы хотите, чтобы UrlHelper помогал генерировать действительные URL-адреса в вашем приложении MVC?
Вы можете попробовать написать обработчик в своем приложении MVC, который будет работать под вашим контекстом приложений, который будет создавать URL-адрес для вас и возвращать его. Затем вы можете вызвать обработчика из своего планировщика, чтобы получить любой URL-адрес, который вам нужен, в зависимости от параметров, которые вы передаете. Таким образом, ваш планировщик просто должен знать, где находится URL-адрес вашего MVC-приложения, а затем может попросить его сделать Url для вас.
Надеюсь, что это немного лучше ответа. Если я полностью отпущу, дайте мне знать... собирался удалить мой ответ, но подумал, что я дам ему еще один выстрел.
Не забудьте указать параметр протокола при использовании метода UrlHelper.Action, это будет генерировать абсолютные URL. Пример:
url.Action("Action", "Controller", null, "http")
или
url.Action("Action", "Controller", null, request.Url.Scheme)
Для создания UrlHelper вам понадобится RequestContext
. В одном из моих методов расширения HtmlHelper я делаю это следующим образом:
public static string ScriptUrl(this HtmlHelper html, string script)
{
var url = new UrlHelper(html.ViewContext.RequestContext);
...
}
Как вы получаете RequestContext
, зависит от вашего приложения.