16

我正在使用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 实例可用 - 但这对我来说似乎有点hacky。

4

4 回答 4

6

在这个答案中为 UrlHelpler 创建一个新的 HttpContext 怎么样:

于 2010-03-23T23:01:39.930 回答
1

编辑: 对不起,我完全误读了我猜的问题。

听起来您的调度程序(我不知道它是如何工作的)是一个单独的过程,您希望 UrlHelper 帮助在您的 MVC 应用程序中生成有效的 URL?

您可以尝试在您的 MVC 应用程序中编写一个处理程序,该处理程序将在您的应用程序上下文中运行,它将为您构建 URL 并返回它。然后,您可以从您的调度程序调用处理程序,以根据您传入的参数获取您需要的任何 URL。这样,您的调度程序只需要知道 MVC 应用程序的查询 URL 在哪里,然后可以要求它执行 Url为你映射。

希望这是一个更好的答案。如果我完全离开,请告诉我……我会删除我的回复,但我想我会再试一次。

于 2010-03-09T21:41:56.590 回答
0

记得在使用 UrlHelper.Action 方法时指定协议参数,这将生成绝对 url。例子:

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

或者

url.Action("Action", "Controller", null, request.Url.Scheme)
于 2012-03-05T09:15:49.100 回答
-2

您需要RequestContext创建一个 UrlHelper。在我的 HtmlHelper 扩展方法之一中,我这样做:

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

如何获得RequestContext取决于您的应用程序。

于 2010-03-09T21:52:36.833 回答