【问题标题】:ASP.NET MVC: How to create a usable UrlHelper instance?ASP.NET MVC:如何创建可用的 UrlHelper 实例?
【发布时间】:2010-03-09 21:38:26
【问题描述】:

我正在使用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。

【问题讨论】:

  • 哇,反对票在这个线程上飞走了:)
  • @Kelsey 也许是因为这个问题似乎太琐碎,所以人们倾向于给出琐碎或不相关的答案,或者这个问题至少需要不太知名的框架(石英)的基本知识
  • 这个石英调度器是否使用类似于 Jeff 在 blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet 上发帖的方法?
  • 到目前为止,大多数答案的问题是他们假设石英任务将在用户请求中运行,但它不会,诸如 HttpContext.Current 之类的将无法正常工作。该问题类似于缓存过期事件(也不会作为用户请求的一部分运行)。

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


【解决方案1】:

answer 那样为 UrlHelpler 创建一个新的 HttpContext 怎么样:

【讨论】:

  • 同时我使用了一种不同的方法,但这个方法似乎可行,即使它有点 hacky。感谢您找到答案:)
  • @Marek - 你是如何解决你的问题的?我遇到了类似的问题,我需要 HttpContext 来呈现一个视图,因为我在石英完成后使用该视图发送一封电子邮件。
  • @chobo - 我最终创建了一个执行周期性 http 请求并在控制器操作中实现逻辑的外部应用程序。
【解决方案2】:

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

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

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

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

【讨论】:

  • 谢谢,只有一个“硬编码”众所周知的 url 来提供所需的路由映射的想法很有趣——即使它相当于调用一个动作来触发评估服务HTTP 请求。现在撤消我的反对票:)
  • 是的,我想不出任何其他方法,因为您的 MVC 应用程序确实是唯一可以访问您需要的上下文的东西。这是一个有趣的问题,我一直在使用配置文件中的硬编码 URL,我留下 {0} 参数以根据 ID 进行替换。从来不喜欢这个解决方案,所以我很想看看是否有更好的方法。
  • 请注意,此代码仍在 MVC 应用程序中运行 - 但不处理任何请求。如果我可以捕获 任何 请求并将 UrlHelper 实例存储到已知位置,那么问题将得到解决(是的,闻起来很香)
  • 这个答案听起来很合理。如果在计时器过去后,您只需在自己的应用程序上调用某个 URL,该 URL 将构建并返回您正在寻找的构建 URL。
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

    • 您能否在我发布的示例中指定如何获取 HttpContext?这个问题似乎和我原来的问题一样——我不在 MVC 请求处理管道中,调度的作业是从 Quartz 调度程序调用的。
    • 在 MVC 管道之外,我不确定。您可能需要手动设置路线等,因为框架并没有为您做任何事情。这可能是可能的,但听起来不值得麻烦。
    猜你喜欢
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    相关资源
    最近更新 更多