代码之家  ›  专栏  ›  技术社区  ›  youen

asp。net应用程序未自动启动

  •  2
  • youen  · 技术社区  · 7 年前

    我正在尝试为我的asp实现以下功能。承载在IIS 8.5中的net MVC应用程序:

    • 应用程序必须每天在指定的时间重新启动一次

    以下是我在IIS中的当前配置:

    • 应用程序池:
      • 启动模式=始终运行
      • 空闲超时=0
      • 禁用重叠回收=True(也不适用于“False”)

    我的问题是,应用程序在指定的时间关闭得很好(我通过在未来几分钟内添加另一个条目来进行测试),但在那之后它不会重新启动,我在日志中验证了这一点(application\u Start没有运行),并且第一个请求的启动时间很长(约为15秒,而后续请求约为0.07秒)。

    是我做错了什么,还是IIS无法自动启动我的应用程序?

    3 回复  |  直到 7 年前
        1
  •  2
  •   Joshua Morgan    7 年前

    我认为应用程序/站点IIS无法自行重启。多年来,我已经研究过几次了,实现这一点最可靠的方法是通过预定任务调用页面并保持网站的活力。

    这是一个 script.vbs

    Option Explicit
    Dim url, xmlhttp
    
    Set xmlhttp = CreateObject("MSXML2.ServerXMLHTTP")
    url = "http://example.com/page"
    xmlhttp.open "GET", url, 0
    xmlhttp.send ""
    
    Set xmlhttp = Nothing
    
        2
  •  2
  •   youen    7 年前

    在尝试了各种设置后,结果表明IIS直到第一次请求时才会加载应用程序DLL,除非您给它一个 serviceAutoStartProvider https://weblogs.asp.net/scottgu/auto-start-asp-net-applications-vs-2010-and-net-4-0-series

    您必须这样配置IIS:

      • 空闲超时=0
      • 回收/特定时间=03:00:00(这只是一个示例,它将在每天的指定时间重新启动应用程序)

    C:\Windows\System32\inetsrv\config\applicationHost.config (此处仅显示相关部分):

    <configuration>
      <system.applicationHost>
        <sites>
          <site name="your site name" serverAutoStart="true">
            <application [...] serviceAutoStartEnabled="true" serviceAutoStartProvider="WarmUp">
            </application>
          </site>
        </sites>
    
        <serviceAutoStartProviders>
            <add name="WarmUp" type="WarmUp, YourApplicationDLL" />
        </serviceAutoStartProviders> 
      </system.applicationHost>
    </configuration>
    

    然后必须在应用程序DLL中添加一个类:

    public class WarmUp : System.Web.Hosting.IProcessHostPreloadClient
    {
        public void Preload(string[] parameters)
        {
            // This is the entry point, but your website is not serving
            // pages yet here, so we can't send requests yet. Instead we
            // start a new thread and return immediately. You could add
            // initialization code that must run before serving any request.
            new Thread(DoWarmUp).Start();
        }
    
        private static void DoWarmUp()
        {
            // Here we just send a request to the home page to preload it.
            // This will run Application_Start, and compile .cshtml files
            // if you use Razor ; you may want to add more pages to preload
            using (var client = new WebClient())
            {
                client.DownloadData("http://localhost/MyHomePageIWantToPreload");
            }
        }
    }
    

    就这样,现在您的web应用程序实际上已经准备好为主页提供服务,不再需要任何额外的延迟。如果您的应用程序中有需要预加载的特定内容,则可以在中添加更多初始化代码 DoWarmUp .

        3
  •  0
  •   Derek Massey    4 年前

    似乎没有人提到的一点是,您必须安装“应用程序初始化”才能使其工作。

    服务器管理器-->管理-->添加角色或功能-->下一步-->下一步-->下一个 并检查“应用程序初始化”