ASP.NET站点以递归方式HTTP请求自己的URL

时间:2013-01-27 15:46:53

标签: asp.net iis reentrancy

背景:我有一个ASP.NET MVC网络应用程序。我想定期捕获其用户可见的HTML内容并将其保留在某个地方,以便我可以跟踪内容随时间的变化情况。我希望能够提取一年前存在的主页HTML。这可以使用某种定期遍历URL列表的爬虫来完成。

我的问题:将网站本身问题HttpWebRequest发送到自己的网址是不是一个好主意?我可以在网络应用程序中启动Timer,每小时下载并存储一个URL。

另一种体系结构是将爬网程序放在外部应用程序(如Windows服务)中。不过,这将是一个更复杂的架构。在这个问题中,我不想探索这个选项,因为我试图摆脱一个更简单的架构。

如果ASP.NET应用程序使用HttpWebRequest请求自己的网址,会出现什么问题?

在伪代码中:

StartTimer(TimeSpan.FromHours(1), () => {
 var url = "http://localhost/SomePageInTheCurrentW3wpProcess.aspx";
 var data = new WebClient().DownloadString(url); //calling current application
 Persist(data);
});

我不确定会发生什么坏事。我正在考虑解决重入问题。我必须小心分布式死锁等等。

1 个答案:

答案 0 :(得分:1)

  

让网站本身向自己的网址发布HttpWebRequests是不是一个好主意?

不,一点也不。运行periodic background tasks in an ASP.NET application是一项危险的任务。如果你走那条路,那么很多你无法控制的东西都会出错。 Phil Haack在他的博文中涵盖了大部分内容。在朝这个方向前做好之前最好先建议。

顺便说一下,如果托管Windows服务是一个太复杂的架构,一个简单的控制台应用程序计划使用Windows Scheduler定期运行可以很好地适应这个法案,并且比你做得更好尝试将ASP.NET用于非设计用途(例如执行定期后台任务)。