ASP.NET MVC:如何创建可用的UrlHelper实例?

时间:2010-03-09 21:38:26

标签: asp.net-mvc quartz-scheduler quartz.net

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

4 个答案:

答案 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取决于您的申请。