【问题标题】:How to schedule a [WebMethod] in Web Services in .net?如何在 .net 的 Web 服务中安排 [WebMethod]?
【发布时间】:2012-01-15 15:48:39
【问题描述】:

我刚学了一点 .net 中的 Web 服务(.asmx 和所有东西)

对于我的项目,我需要安排一个程序来抓取一组网站,然后每 30 分钟将新可用的数据更新到数据库中。

我创建了一个[WebMethod] 用于运行爬虫代码和更新数据库(如果有)。

但我希望这个 [WebMethod] 自动运行并每 30 分钟运行一次?

【问题讨论】:

  • 为什么要把爬虫方法变成Web Method?
  • 你知道,asmx 是遗留的,你应该看看 WCF。
  • @BasB :我需要安排时间,以便我可以在每 30 分钟左右获得更新的数据库。

标签: c# asp.net web-services asmx webmethod


【解决方案1】:

不需要创建WebMethod来做这个,你可以在服务器端制作,对于调度操作,我总是使用Quartz.net

【讨论】:

  • 如果 Quartz.net 托管在共享托管环境、IIS 等上,它是否可以安排我的任务?
  • @gustavo +1 for quartz.net 看起来很有趣
  • @ItsLockedOut 可以,我通常在 IIS 上托管的 asp.net 网站中使用
【解决方案2】:

我可能不正确,但您似乎想使用 asp.net 安排后台任务?我没有使用 Quartz.Net,但我使用Jeff Attwood 提供的一个简单示例完成了这项工作。以下代码来自 Global.asax.cs,在应用程序启动时每 60 分钟安排一次重复作​​业:

void Application_Start(object sender, EventArgs e)
{
    var refreshMinutes = 60;
    AddTask("UpdateInfo", 
            (int)TimeSpan.FromMinutes(refreshMinutes).TotalSeconds);
}

private void AddTask(string name, int seconds)
{
    OnCacheRemove = new CacheItemRemovedCallback(CacheItemRemoved);
    HttpRuntime.Cache.Insert(name, seconds, null,
        DateTime.Now.AddSeconds(seconds), Cache.NoSlidingExpiration,
        CacheItemPriority.NotRemovable, OnCacheRemove);
}

public void CacheItemRemoved(string key, object v, CacheItemRemovedReason r)
{
    if ("UpdateInfo".Equals(key))
    {
        try
        {
            new SearchService().UpdateInfo();
        }
        catch (Exception ex)
        {
            logger.Error("UpdateInfo threw an exception: {0} {1}", ex.Message, ex.StackTrace);
        }
    }

    AddTask(key, Convert.ToInt32(v));
}

注意 Phil Haack 在 The Dangers of Implementing Recurring Background Tasks In ASP.NET 上发表了一篇文章,其中提供了一些有用的技术来使流程更加健壮。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多