【问题标题】:IIS thinks webservice is IdleIIS 认为 web 服务是空闲的
【发布时间】:2011-02-08 22:24:38
【问题描述】:

问题是即使我将线程设置为“thrd.IsBackground = false”,iis 也不认为它正在运行,即使这是一个长时间运行的进程。如果我不关闭应用程序池的空闲关闭,它将关闭,因为它认为它是空闲的。同样,如果我部署一个新版本,它会中止所有正在运行的线程,而不是在回收和使用新代码之前等待所有进程真正空闲。我在这里做错了什么? 这是我的网络服务代码:

  /// <summary>
    /// Summary description for LetterInitiateWS
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]
    public class LetterInitiateWS : System.Web.Services.WebService
    {

        private static Processor processor = new Processor();
        [WebMethod]
        public void ExecuteBulkRun()
        {
            var thrd = new Thread(() => ThreadExecuteBulkRun());
            thrd.IsBackground = false;
            thrd.Start();

        }

        [WebMethod]
        public void ExecuteTemplateBulkRun(string templateCategory, string TemplateType)
        {
            var thrd = new Thread(() => ThreadExecuteTemplateBulkRun(templateCategory, TemplateType));
            thrd.IsBackground = false;
            thrd.Start();

        }

        private void ThreadExecuteBulkRun()
        {
            processor.ExecuteBulkRun();
        }
        private void ThreadExecuteTemplateBulkRun(string templateCategory, string TemplateType)
        {
            processor.ExecuteTemplateBulkRun(templateCategory, TemplateType);
        }

    }
}

【问题讨论】:

  • 是否可以选择使用 WCF?我已经成功地使用 WCF 运行后台线程而没有 IIS 超时。我使用一个 ServiceHostFactory 来启动后台线程来定期执行代码。
  • 不,我需要使用 web 服务,因为我是从 sql 作业调用它的方式
  • 当您部署一个新版本时,您会强制 AppDomain 卸载它中止所有活动线程。无法回避这个事实。您可以在某处创建一个锁,以允许现有线程完成并拒绝新请求。完成所有线程后,您就可以升级了。我认为,但不知道,空闲超时是基于最后一个请求,而不是服务器在做什么,所以我不知道如何帮助你。
  • 如果您将处理器放入 Application["processor"] 并为线程执行相同操作,会有帮助,因此有一个应用程序范围的线程列表。 webservice 实现超出范围这一事实可能也会破坏所有本地引用
  • rene,这很有趣。我不确定如何实现它

标签: .net multithreading web-services iis


【解决方案1】:

IIS 不够稳定,无法运行长时间运行的进程。它专为请求-响应类型的交互而设计。

如果您需要长时间运行某些东西,请在 Windows 服务中运行它。您可以使用远程处理或消息队列从您的网络服务启动它。

【讨论】:

    【解决方案2】:

    您可以做的一件事是挂钩Application_End 事件。在最坏的情况下,您可以记录哪些线程需要完成,最好的情况是您可以设置某种延迟,使应用程序在线程完成之前保持活动状态。

    【讨论】:

      猜你喜欢
      • 2017-08-27
      • 1970-01-01
      • 1970-01-01
      • 2014-07-18
      • 1970-01-01
      • 2016-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多