2016-09-13 2 views
0

У меня есть два веб-сайта, один клиентский сайт и веб-сайт WEBAPI. У меня проблема с производительностью на веб-сайте ценообразования, так как она часто приостанавливается из-за низкого использования, и при первом вызове требуется время для инициализации. Если я повторю запрос сразу после этого, это очень быстро.Предварительная инициализация сайта с другого сайта

Я знаю, что он будет использоваться на определенных страницах клиентского веб-сайта, поэтому я хочу называть его, когда эта страница загружается так, что она готова, когда пользовательский запрос поступит через несколько секунд. Обратите внимание, что сайт WEBAPI для ценообразования недоступен для клиента, только клиентский сайт может получить к нему доступ на стороне сервера.

Я не знаю наилучшего подхода к этому, я не хочу влиять на производительность клиентского сайта. Я рассмотрел 1px x 1px iFrame, вызывающий страницу, но обеспокоенный тем, что он заблокирует страницу. Является ли вызов Ajax более подходящим, но как мне позвонить на веб-сайте клиента, чтобы в свою очередь вызвать веб-сервис? Есть ли лучший подход, который я не рассматривал?

ответ

0

Известная проблема в средах с общим хостингом, обходной путь в порядке, но я бы предложил обновить ваш сервер. В моем хостинге есть опция DotNetNuke, которая по существу означает, что она зарезервирует память на сервере и не будет перерабатывать пул приложений из-за неактивности. По сравнению с VPS это дешевле.

Если это не общий хостинг, these IIS settings could help you.

Во всяком случае, обратно в обходной путь:

Вы говорите клиент не может получить доступ к WebAPI, только фоновым вашего сайта может. Кажется странным, потому что webapi предоставляет методы REST GET, POST. В любом случае вы можете выполнить асинхронный вызов своего веб-сервера на стороне сервера, который не ждет ответа или выполняет вызов javascript в ваш API.

Предположим, что ваш веб-сайт также 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 для некоторых других обходных путей.

Смежные вопросы