ASP.NET MVC: как создать полезный экземпляр UrlHelper?

Я использую 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 - но это кажется мне немного взломанным.

Ответы

Ответ 1

Как просто создать новый HttpContext для UrlHelpler, как в этом answer:

Ответ 2

Изменить: Извините, я совершенно неправильно читаю вопрос, который, я думаю.

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

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

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

Ответ 3

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

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

или

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

Ответ 4

Для создания UrlHelper вам понадобится RequestContext. В одном из моих методов расширения HtmlHelper я делаю это следующим образом:

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

Как вы получаете RequestContext, зависит от вашего приложения.