Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc ASP.NET MVC:如何创建可用的UrlHelper实例?_Asp.net Mvc_Quartz Scheduler_Quartz.net - Fatal编程技术网

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

Asp.net mvc ASP.NET MVC:如何创建可用的UrlHelper实例?,asp.net-mvc,quartz-scheduler,quartz.net,Asp.net Mvc,Quartz Scheduler,Quartz.net,我正在使用quartz.net计划asp.net mvc应用程序中的常规事件 计划作业应调用需要UrlHelper实例的服务层脚本(用于根据服务将发送的电子邮件中包含的正确路由()通过UrlHelper.Action(..))创建URL) 我不想硬编码到电子邮件的链接-他们应该使用urlhelper解决 工作: public class EvaluateRequestsJob : Quartz.IJob { public void Execute(JobExecutionContext

我正在使用quartz.net计划asp.net mvc应用程序中的常规事件

计划作业应调用需要UrlHelper实例的服务层脚本(用于根据服务将发送的电子邮件中包含的正确路由(
)通过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实例-但这对我来说似乎有点黑客行为。

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

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

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


希望这是一个更好的答案。如果我完全失望了,让我知道。。。要删除我的响应,但我想我会再尝试一次。

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

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

如何获取请求上下文取决于您的应用程序。

如何为UrlHelpler创建一个新的HttpContext,如下所示:

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

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


您能否在我发布的示例中指定如何获取HttpContext?这个问题似乎相当于我原来的问题-我不在MVC请求处理管道内,调度的作业是从Quartz调度程序调用的。在MVC管道外,我不确定。您可能需要手动设置路由等,因为框架没有为您执行任何操作。这可能是可能的,但听起来不值得这么麻烦。哇,反对票在这个帖子上飞来飞去:)@Kelsey可能是因为这个问题似乎太琐碎了,所以人们倾向于给出琐碎或不相关的答案,或者这个问题至少需要一些不太知名的框架(quartz)的基本知识这个quartz调度程序是否使用了与Jeff发表文章的方法类似的方法:?到目前为止,大多数答案的问题是,他们假设quartz任务将在用户请求中运行,而它不会,比如HttpContext。Current无法正常工作。这个问题和缓存过期事件(也不作为用户请求的一部分运行)的问题类似。可能重复感谢,即只有一个“硬编码”的想法提供所需路由映射的众所周知的url是有趣的,即使它相当于调用一个将通过HTTP请求触发评估服务的操作。现在撤销我的否决票:)是的,我想不出任何其他方式来做这件事,因为你的MVC应用程序是唯一能够访问你需要的上下文的东西。这是一个有趣的问题,我一直在使用配置文件中的硬编码URL,在配置文件中,我留下了基于ID替换的
{0}
参数。我从来都不喜欢这个解决方案,所以我很想看看是否有更好的方法来实现它。请注意,这段代码仍在MVC应用程序中运行,但不提供任何请求。如果我能够捕获任何请求并将UrlHelper实例存储到一个已知的位置,问题就会得到解决(是的,闻起来很香)。这个答案听起来很合理。如果,随着时间流逝,你只需在你自己的应用程序上调用某个URL,该URL将生成并返回你正在查找的已生成URL。与此同时,我使用了一种不同的方法,但这一方法似乎可以工作,即使它有点粗糙。谢谢你找到答案:)@Marek-你是如何解决你的问题的?我遇到了类似的问题,我需要HttpContext来呈现一个视图,因为我在quartz完成后使用该视图发送电子邮件。@chobo-我创建了一个外部应用程序,该应用程序执行重复的http请求,并在控制器操作中实现了逻辑。
url.Action("Action", "Controller", null, request.Url.Scheme)