我有两个网站,一个客户网站和一个定价WEBAPI网站。我在定价网站上存在性能问题,因为它经常因使用率低而暂停,并且在第一次调用时需要时间来初始化。如果我在此之后立即重复请求,那就非常快。
我知道它将在客户端网站的某些页面上使用,因此我希望在该页面加载时调用它,以便在用户有效请求在几秒钟之后到达时就绪。请注意,客户端无法提供WEBAPI定价网站,只有客户网站可以在服务器端访问它。
我不知道最好的方法,我不希望影响客户网站的性能。我考虑过1px x 1px iFrame调用页面,但担心它会阻止页面。 Ajax调用是否更合适,但如何在客户端网站上调用某些内容来依次调用web服务?有没有更好的方法我还没考虑过?
答案 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。