从另一个站点预初始化一个网站

Pre-initialise a website from another site

我有两个网站,一个客户端网站和一个定价 WEBAPI 网站。我的定价网站存在性能问题,因为它经常因使用率低而自行挂起,并且在第一次调用时需要时间进行初始化。如果我在那之后立即重复这个请求,那就非常快了。

我知道它将在客户端网站的某些页面上使用,因此我希望在该页面加载时调用它,以便在用户有效请求几秒钟后到达时准备就绪。请注意定价WEBAPI站点在客户端不可用,只有客户端网站可以在服务器端访问它。

我不知道最好的方法,我不想影响客户端网站的性能。我考虑过调用页面的 1px x 1px iFrame,但担心它会阻止页面。 Ajax 调用是否更合适,但我如何在客户端网站上调用某些内容来依次调用网络服务?有没有我没有考虑过的更好的方法?

共享托管环境的已知问题,解决方法很好,但我建议升级您的服务器。我的主机有一个 DotNetNuke 选项,这实际上意味着它将在服务器上保留内存并且不会因不活动而回收应用程序池。与 VPS 相比,这更便宜。

如果不是共享主机,these IIS settings could help you

无论如何,回到您的解决方法:

你说客户端不能访问webapi,只有你网站的后台可以。看起来很奇怪,因为 webapi 公开了 REST GET,POST 方法。无论哪种方式,您都可以在不等待响应的服务器端对您的 webapi 进行异步调用,或者对您的 API 进行 javascript 调用。

假设您的网站也是 ASP.NET:

public static async Task StartupWebapi()
{
    string requestUrl = "http://yourwebapi.com/api/startup";

    using (var client = new HttpClient())
    {
        //client.Timeout = new TimeSpan(0, 0, 20); timeout if needed
        try
        {
            HttpResponseMessage response = await client.GetAsync(requestUrl);
            if (response.IsSuccessStatusCode)
            {
                resultString = await response.Content.ReadAsStringAsync();
            }
        }

    }
}

然后,在您的代码中的某处,至少会在您的客户网站启动时调用它。

HostingEnvironment.QueueBackgroundWorkItem(ct => SomeClass.StartupWebapi());

或者在javascript中,是异步执行的

$.ajax({
    url: "http://yourwebapi.com/api/startup",
    type: "GET",
    success: function (response) {
    },
    error: function (response) {

    }
});

有关其他解决方法,请参阅 this question