【发布时间】:2021-03-21 21:34:57
【问题描述】:
我最近部署了一个在共享托管环境中运行的站点。问题是该站点接收到零星的流量:20 分钟后,我想服务器关闭了实例,因此当站点加载第一个请求时,它通常很慢。所以我决定添加一个每隔几分钟加载一次网页的功能。我用new CodeKeepAlive.KeepAliveManager().SetKeepAlive(); 调用 Global.asax 中的代码,这是完整的代码:
public class KeepAliveManager
{
Timer KeepAliveTimer;
public void SetKeepAlive()
{
KeepAliveTimer = new Timer(DoKeepAliveRequest, null, new Random().Next(200000, 900000), Timeout.Infinite);
}
public void DoKeepAliveRequest(object state)
{
string TheUrl = "https://www.the_website_url.com";
HttpWebRequest TheRequest = (HttpWebRequest)WebRequest.Create(TheUrl);
HttpWebResponse TheResponse = (HttpWebResponse)TheRequest.GetResponse();
KeepAliveTimer.Change(new Random().Next(200000, 900000), Timeout.Infinite);
}
}
由于某种原因,由于我添加了此功能,因此网站偶尔会锁定一次;加载时间 30 秒后,服务器说无法加载页面。我还有一个在Application_Error 上触发的错误日志记录功能,但没有日志。
我的代码有什么问题吗?
【问题讨论】:
-
结帐Do C# Timers elapse on a separate thread? 看看你用的是什么类型的计时器。由于您每次都在进行 HTTP 调用,因此该站点可能已锁定。确保计时器回调在单独的线程上运行。无论如何,你正在做一个丑陋的黑客攻击,并没有解决你声称的服务器关闭实例的正确问题。
-
您是否可以在 IIS 中为站点使用单独的应用程序池并将其配置为不关闭?
-
为什么不简单地禁用或延长应用程序池 20 分钟的关闭时间?或者制作一个充当保活工具的 Windows 服务。
-
而且,如果您的保活代码存在一个问题,则可能是响应未关闭 (
TheResponse.Close()),这可能导致连接不足。毕竟无法与服务器建立新的连接。 -
查看 IIS 中的空闲超时
标签: c# asp.net shared-hosting