Замедлите первый груз страницы на территории asp.net

Время от времени (всегда после длительного периода свободного времени, например, в течение ночи), когда я получаю доступ к месту, построенному, используя asp.net - требуется приблизительно 15 секунд, чтобы загрузить страницу (за 15 секунд до того, как я буду видеть любой прогресс вообще, тогда страница подходит быстро).

Дальнейшие страницы на той территории или освежительные напитки, быстры, как обычно - они также быстры на других машинах, только первый, кажется, получает 'удар'.

Страница, прослеживающая никогда через что-либо (целый цикл был долей секунды),

Таким образом, мой вопрос состоит в том, где еще я должен смотреть? Возможно, IIS? Или это могло все еще быть мое приложение asp.net, и я просто смотрю в неправильном месте (след) для подсказок?

Поскольку я не имею большого контроля над сервером IIS, ничто, что я могу послать багажом asp.net, было бы более полезным, прежде чем я пойду, просят что конкретный администратор.

аплодисменты :D

40
задан Tabloo Quijico 20 January 2010 в 15:41
поделиться

6 ответов

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

39
ответ дан 27 November 2019 в 01:30
поделиться

Если вы хотите, чтобы он был интерактивным, и хотите включить его в веб-страницу, вы можете рассмотреть возможность использования flot jquery плагин.

-121--1043865-

Вы упоминаете, что движок является общим кодом, поэтому вы помещаете его в отдельный проект под свое решение. Нет ничего плохого в том, чтобы сделать это таким образом, и нет необходимости добавлять эту DLL в GAC. На этапе разработки можно просто добавить ссылку на проект движка и вызвать код из этой сборки. Если требуется развернуть это приложение, можно либо развернуть с ним библиотеку DLL движка, либо добавить библиотеку DLL движка в GAC (который сам по себе является еще одним мячом воска). Я склонен склоняться к развертыванию GAC, если это не действительно необходимо. Одной из лучших возможностей .NET является возможность развертывания всего необходимого для запуска приложения в одной папке без необходимости копирования материалов в системные папки (т.е. GAC).

Если вы хотите получить что-то вроде динамической загрузки DLL и вызова методов членов с вашего процессора, не заботясь о конкретной версии, вы можете пройти пару маршрутов. Самый простой маршрут заключается в установке для свойства Specific Version значения False при добавлении ссылки. Это даст вам свободу изменить DLL позже, и пока вы не возиться с сигнатур метода, это не должно быть проблемой. Второй вариант - MEF (который использует отражение и будет частью рамки в .NET 4,0). Идея с MEF заключается в том, что вы можете сканировать папку стиля «плагины» для DLL, которые реализуют определенные функциональные возможности, а затем вызывать их динамически. Это дает дополнительную гибкость в том смысле, что новые сборки можно добавлять позже без необходимости изменения привязок.

Следует также отметить, что в Visual Studio встроены шаблоны проектов установки и развертывания, которые можно использовать для создания пакетов MSI для развертывания проектов. У MSDN есть много документации, связанной с этой темой, которую вы можете узнать, здесь:

http://msdn.microsoft.com/en-us/library/ybshs20f%28VS.80%29.aspx

-121--407669-

Вы также можете ознакомиться с функцией Автозапуск 4,0 рамок.

21
ответ дан 27 November 2019 в 01:30
поделиться

Тебовые ответы, которые отметили, что IIS отключится на холостом ходу, поскольку ваш сайт возвращается в ваше заявление. Как вы пожалеете (в пределах вашей глобальной. Это может замедлить ваше приложение. Другие вещи, которые происходят на все ваши кеши, будут пустыми, все ваше соединение БД будет отключено.

Это поведение настраивается в IIS, если у вас нет доступа к настройкам IIS, хакивый способ вокруг этого - это ударить на ваш сайт каждые 10 минитров либо из сценария или специальной страницы, которая имеет мета-обновление.

Ваш другой вариант состоит в том, чтобы принять, что первая страница поступления дня займет несколько секунд дольше, а затем USAL.

5
ответ дан 27 November 2019 в 01:30
поделиться

Проекты могут ссылаться на сборки или проекты.

Когда вы ссылаетесь на другую сборку/проект, вы можете использовать все общие классы/перечисления/структуры и т.д. в сборке, на которую вы ссылаетесь.

Вам не нужно иметь все их в одном решении. Можно иметь три решения, по одному для каждого процесса, и все три решения могут загружать модуль и фильтр.

Кроме того, процесс B и процесс C могут ссылаться на скомпилированные сборки (.dll) модуля и фильтра и иметь аналогичный эффект.

Если свойство в ссылке на сборку не требует определенной версии, можно свободно обновлять библиотеки DLL без особых проблем, при условии, что только изменения кода были внесены в библиотеку DLL.

Также основная причина, по которой мы отделял фильтр от процесса (его использует только один процесс) мы можем развернуть фильтр независимо из процесса, чтобы процесс не требуется обновление исполняемого файла. Независимо от того, является ли это наилучшей практикой, Давай просто покататься с ним. Это что, возможно?

Я на самом деле предпочитаю этот способ обновления. Меньше затрат на обновление только тех файлов, которые менялись, а не всего каждый раз.

Что касается использования GAC, то на весь другой уровень сложности я не попаду.

Защита сборок от изменений может быть выполнена путем их подписания, что необходимо для использования GAC в первую очередь, но вы все равно должны быть в порядке, если не требуется конкретная версия.

Я рекомендую прочитать книгу о рамке .NET. Это действительно поможет вам понять CLR и то, что вы делаете.

Прикладное программирование Microsoft .NET Framework - это книга, которую мне очень понравилось читать.

-121--4407668-

Возможно, стоит показать, почему для выполнения нужного преобразования требуется нарушение конст-корректности:

#include <vector>
const int a = 1;

void addConst(std::vector<const int *> &v) {
    v.push_back(&a); // this is OK, adding a const int* to a vector of same
}

int main() {
    std::vector<int *> w;
    int b = 2;
    w.push_back(&b);  // this is OK, adding an int* to a vector of same
    *(w.back()) = 3;  // this is OK, assigning through an int*
    addConst(w);      // you want this to be OK, but it isn't...
    *(w.back()) = 3;  // ...because it would make this const-unsafe.
}

Проблема заключается в том, что vector < int * > .push _ back принимает указатель на конст (который теперь я назову «неконст-указатель»). Это означает, что он может изменить точку своего параметра. В частности, в случае вектора, он может передать указатель обратно тому, кто изменяет его. Таким образом, вы не можете передать указатель const на функцию push_back w, и преобразование, которое вы хотите, небезопасно, даже если система шаблонов поддерживает его (который он не поддерживает). Цель const-safety - остановить передачу указателя const на функцию, которая принимает указатель non-const, и именно так она выполняет свою работу. C++ требует, чтобы вы конкретно сказали, если вы хотите сделать что-то небезопасное, поэтому преобразование, конечно, не может быть неявным. На самом деле, из-за того, как работают шаблоны, это вообще невозможно (см. далее).

Я думаю, что C++ может в принципе заповедник конст-безопасность, позволяя преобразование из вектора < T * > & в конст-вектор < const T * > & , так же как int * * в конст * конст * является безопасным. Но это из-за способа определения вектора: он не обязательно будет конст-безопасным для других шаблонов.

Аналогично,он теоретически может допускать явное преобразование. И фактически, он допускает явное преобразование, но только для объектов, а не для ссылок; -)

std::vector<const int*> x(w.begin(), w.end()); // conversion

Причина, по которой он не может сделать это для ссылок, заключается в том, что система шаблонов не может поддерживать его. Другой пример, который был бы нарушен, если бы преобразование было разрешено:

template<typename T> 
struct Foo {
    void Bar(T &);
};

template<>
struct Foo<const int *> {
    void Baz(int *);
};

Теперь Foo < int * > не имеет функции Баз. Как можно преобразовать указатель или ссылку на Foo < int * > в указатель или ссылку на Foo < const int * > ?

Foo<int *> f;
Foo<const int *> &g = f; // Not allowed, but suppose it was
int a;
g.Baz(&a); // Um. What happens? Calls Baz on the object f?
-121--1546206-

Можно запланировать повторное использование пула приложений, возможно, с помощью сценария разогрева. Сначала предоставьте ему собственный пул приложений и проверьте, помогает ли это.

5
ответ дан 27 November 2019 в 01:30
поделиться

Я столкнулся с той же проблемой в прошлом. Мне никогда не удалось добраться до снижения этой проблемы, но я подозревал, что бассейны приложений IIS были виновником.

2
ответ дан 27 November 2019 в 01:30
поделиться

Если вы используете IIS 7, есть плагин IIS под названием Application Warm Up, который поможет

Я написал сообщение в блоге о своем опыте его использования здесь (не знаю, разрешено ли мне публиковать свои материалы?):

http://www.diaryofaninja.com/blog/2010/05/06/keep-your-aspnet-websites-warm-and-fast-247

10
ответ дан 27 November 2019 в 01:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: