2010-05-27 64 views
0

我的ASP.NET MVC应用程序需要在启动时和后台定期运行一组任务。我已将每项任务实施为控制器操作,并列出数据库中操作的应用程序相对路径。我实现了一个TaskRunner进程,它从数据库获取URL并使用WebRequest.Create以固定的时间间隔请求每个URL,但是这会抛出UriFormatException。我不能使用this answer或任何代码从HttpContext.Current.Request中获取值,而不会收到HttpException,并显示消息“请求在此上下文中不可用”。请求对象不可用,因为我的代码使用System.Threading.Timer进行后台处理,建议使用here。这里是我的问题:如何在ASP.NET MVC应用程序的后台请求本地页面?

  1. 是否真的没有办法在ASP.NET Web应用程序内进行本地Web请求?
  2. 即使在ASP.NET中使用静态依赖关系,是否真的没有办法动态确定Web应用程序的根路径?
  3. 我试图避免将应用程序的根路径存储在数据库中(正如FogBugz对其“维护路径”所做的那样),但这是最佳选择吗?

回答

0

ASP.NET MVC可以为实施一个RESTful API,可以通过外部服务调用:

http://omaralzabir.com/create_rest_api_using_asp_net_mvc_that_speaks_both_json_and_plain_xml/

本文上述有关JSON的会谈,但你可以实现你所需要的任务定期运行RESTful操作,只需调用它们的URI即可执行。

+0

谢谢戴夫。我没有阅读链接另一面的文章,所以请原谅我,如果这是离开,但我不能构建一个URI,因为我不知道该应用程序的基本URI。我错过了什么吗? – flipdoubt 2010-05-27 15:22:30

1

您应该有权访问Application_Start处理程序中的当前请求。你能不能简单地在你创建TaskRunner类时为你的TaskRunner类注入所需的值,而只是从那里重用它,而不是每次尝试获取它们?

protected void Application_Start() 
{ 
    ... 
    var baseUri = this.Context.Request.Url.GetLeftPart(UriPartial.Authority); 
    var runner = new TaskRunner(baseUri); 
    runner.Run(); 
    ... 
} 
+0

只是一个注释 - 如果每个租户的行为不同,它将无法与多租户站点一起使用,因为它只抓取第一个请求中的数据。 – tvanfosson 2010-05-27 15:00:42

+0

这可以使用VS开发服务器,但在IIS 7中启动应用程序时会出现相同的'HttpException'。 – flipdoubt 2010-05-27 15:21:13

相关问题