Обработка ASP.NET резко остановлена ​​на IIS 6.0 - PullRequest
0 голосов
/ 30 ноября 2009

мы заметили довольно странное поведение в одном из наших веб-приложений. При отладке на рабочей станции локального разработчика все обрабатывается нормально (с использованием Cassini Development Webserver). При публикации на удаленном веб-сервере с использованием IIS 6.0 обработка выполняется нормально около 4 или 5 минут, а затем внезапно умирает.

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

// loads data from SAP Webservice and serializes it into database    
LoadXMLDataFromSAP();

// loop each item of a certain structure and parse data
foreach (var xItem in xSapData)
{
    // method determining a status, about 30 LOC, fast execution
    GetStatusCodeForContract(xItem);

    ...

    // methods to parse data blocks, about 400 LOC, slow execution (database etc.)
    TimeconsumingParserMethod1(xItem);
    TimeconsumingParserMethod2(xItem);
}

Этот код работает нормально при отладке, выполнение занимает около 13 минут (это нормально, потому что это происходит только при синхронизации всех данных с SAP). При запуске одного и того же кода для одного и того же источника данных SAP в IIS 6.0 выполнение останавливается через 4 или 5 минут.

Сначала программа генерирует исключение System.NullReferenceException по вызову «TimeconsumingParserMethod1 ()», в следующем цикле мы получаем исключение System.NullReferenceException по «GetStatusCodeForContract ()». Поскольку мы используем один и тот же параметр в обоих вызовах, я думаю, что исключение NullReferenceException выбрасывается, поскольку член "xItem" имеет значение null.

Конфигурация сервера:

8 Core Intel machine
4 GB of RAM
RequestTimeout = 900 (15 minutes)
Memory usage = unlimited

Кто-нибудь знает о таком поведении в IIS 6 или аналогичных средах производственных серверов?

1 Ответ

0 голосов
/ 30 ноября 2009

Ну, я наконец-то разыскал проблему. Из-за некоторых проблем с EventLog на нашем локальном тестовом сервере я не заметил некоторых исключений IIS.

Корень проблемы не в тайм-аутах, а в поведении перезапуска AppDomain ASP.NET 2.0. Если вы измените много структур папок во время веб-запроса, домен приложения будет перезагружен, что приведет к таинственным исключениям NullReferenceExceptions.

Следующая статья помогла мне отследить проблему: http://weblogs.asp.net/owscott/archive/2006/02/21/ASP.NET-v2.0-2D00-AppDomain-recycles_2C00_-more-common-than-before.aspx

Фрагмент кода под ссылкой - это используемый обходной путь (он просто отключает мониторинг файлов для подпапок, изменения в файле web.config и сборках, по-прежнему перезагружая домен приложений для автоматического развертывания).

System.Reflection.PropertyInfo p = typeof(System.Web.HttpRuntime).GetProperty("FileChangesMonitor", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static);

object o = p.GetValue(null, null);

System.Reflection.FieldInfo f = o.GetType().GetField("_dirMonSubdirs", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.IgnoreCase);

object monitor = f.GetValue(o);

System.Reflection.MethodInfo m = monitor.GetType().GetMethod("StopMonitoring", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); m.Invoke(monitor, new object[] { });
...