我正在使用quartz.net来安排asp.net mvc应用程序中的常规事件。
预定作业应调用需要UrlHelper实例的服务层脚本(用于根据服务发送的电子邮件中包含的正确路由(via urlHelper.Action(..)
)创建Url。)
我不想将链接硬编码到电子邮件中 - 应该使用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实例可用 - 但这对我来说似乎有点笨拙。
答案 0 :(得分:5)
如何在answer中为UrlHelpler创建新的HttpContext:
答案 1 :(得分:1)
编辑:抱歉,我完全错误地读了这个问题。
听起来您的调度程序(我不知道它是如何工作的)是一个单独的过程,您希望UrlHelper帮助您在MVC应用程序中生成有效的URL吗?
您可以尝试在MVC应用程序中编写一个处理程序,该处理程序将在您的应用程序上下文中运行,该应用程序上下文将为您构建URL并将其返回。然后,您可以从调度程序中调用处理程序,根据传入的参数获取所需的任何URL。这样,您的调度程序只需要知道MVC应用程序的查询URL的位置,然后可以要求它执行Url映射给你。
希望这是一个更好的答案。如果我完全不让我知道......会删除我的回复,但我想再给它一次。
答案 2 :(得分:0)
请记住在使用UrlHelper.Action方法时指定协议参数,这将生成绝对网址。例如:
url.Action("Action", "Controller", null, "http")
或
url.Action("Action", "Controller", null, request.Url.Scheme)
答案 3 :(得分:-2)
您需要RequestContext
来创建UrlHelper。在我的一个HtmlHelper扩展方法中,我这样做:
public static string ScriptUrl(this HtmlHelper html, string script)
{
var url = new UrlHelper(html.ViewContext.RequestContext);
...
}
如何获得RequestContext
取决于您的申请。