从其他站点预先初始化网站

时间:2016-09-13 15:24:12

标签: asp.net-mvc-4 asp.net-web-api2 asp.net-ajax

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

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

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

1 个答案:

答案 0 :(得分:0)

共享托管环境的已知问题,解决方法很好,但我建议升级您的服务器。我的托管有一个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