У меня есть веб-приложение, использующее SubSonic версии 2.1.0. При добавлении некоторых новых функций я обнаружил ошибку в этой версии, которая была исправлена в 2.2.0.
В моем окне разработчика я переключаю версию указанной библиотеки DLL, и все работает нормально.
После обновления сервера Windows 2008 R2 под управлением IIS 7.5 ошибка не исчезла.
Я обыскал сервер и заменил каждый экземпляр SubSonic.dll на последнюю версию.
Перезапустил сайт, пул приложений, а затем и весь сервер.
Я запустил SysInternal Process Explorer и проверил процесс w3wp.exe для сайта, и, согласно ему, w3wp.exe ссылается на версию 2.2.0 SubSonic.dll.
Я скопировал файлы базы данных и сайта с этого сервера Windows 2008 на другой сервер 2008 (тот, на котором никогда не загружалась версия 2.1.0) и подтвердил, что ошибки там нет.
Судя по симптомам, кажется, что сервер поддерживает версию DLL 2.1.0, но я не могу понять, где она находится и как от нее избавиться.
Дополнительная информация:
Я проверил GAC, никаких dll SubSonic.
Установил 2.2.0 в GAC с помощью gacutil из Windows SDK 6.1
Настройте новый сайт и пул приложений на сервере и загрузите новую копию файлов сайта из моего окна разработчика.
Сайт - C # .Net 2.0 с использованием MVC 1 с nHaml 2.0 для механизма просмотра.
Используется cygwin find для поиска файлов в файловой системе того же размера, что и DLL 2.1.
Обнаружил пару копий, которых не было в окне поиска Windows, они были просто в резервной папке, не должны были использоваться, удалены на всякий случай.
Единственные оставшиеся файлы того же размера, что и версия 2.1.0:
./Windows/System32/DriverStore/FileRepository/prnca00z.inf_amd64_neutral_27f402ce616c3ebc/Amd64/CNBDR4_5.DLL
./Windows/winsxs/amd64_microsoft-windows-getuname.resources_31bf3856ad364e35_6.1.7600.16385_en-us_eca42f29f7e4d0ea/getuname.dll.mui
./Windows/winsxs/amd64_prnca00z.inf_31bf3856ad364e35_6.1.7600.16385_none_ea189c313845a10e/Amd64/CNBDR4_5.DLL
./Windows/winsxs/x86_microsoft-windows-getuname.resources_31bf3856ad364e35_6.1.7600.16385_en-us_908593a63f875fb4/getuname.dll.mui
Которые, похоже, не имеют ничего общего с SubSonic DLL.
Обновление 8-30-2010
Причина ошибки в подозрении на используемую версию DLL заключается в следующем:
Произошедшая ошибка довольно специфична, и в моем окне разработки, когда я меняю между 2.1.0 и 2.2.0 DLL, это предсказуемо происходит в версии 2.1.0, а не 2.2.0.
Я также поместил сайт на другой сервер, и он отлично работает с 2.2.0, поэтому он работает не только в моем окне разработки.
По сути, в версии 2.1.0 при выполнении запроса результатов с разбивкой на страницы элементы предложения WHERE удваиваются, поэтому сгенерированный запрос завершается следующим образом: «WHERE CreatedOn> '8-1-2010' AND CreatedOn> '8-1-2010'» .
Хотя это избыточно, синтаксически это нормально для выполнения.
Когда вы добавляете SubQuery, это происходит тогда, когда он идет не так, потому что объект SubQuery генерирует свой SQL дважды и второй раз вместо того, чтобы начинать с WHERE, он начинается с AND, потому что логический флаг в отслеживании объекта, если WHERE был запущен, истина при запуске с первого раза генерации SQL.
Таким образом, в версии 2.1.0 вы получите «WHERE id IN (SELECT id FROM table WHERE CreatedOn> '8-1-2010') AND id IN (SELECT id FROM table AND CreatedOn> '8-1-2010')»
В версии 2.2.0 предложение WHERE в запросе с разбивкой на страницы не повторяет свои условия, поэтому SubQuery не генерирует неправильный синтаксис SQL.
Генерация SQL происходит внутри библиотеки DLL, и я могу наблюдать через SQL Profiler, что 2.1.0 генерирует неправильный синтаксис, но когда я запускаю локально с 2.2.0, синтаксис правильный.
Поскольку эта ошибка является такой конкретной ситуацией, сайт в целом работает нормально, это происходит только с конкретным поисковым запросом, и очень легко повторить, что без изменений кода, данных или структуры данных или других изменений среды возникает ошибка. ниже 2.1.0, но не 2.2.0.
Я не давал подробностей об ошибке ранее, поскольку она не кажется актуальной для решения проблемы, решение должно касаться любой сторонней dll, загруженной из каталога bin кэшируемого сайта asp.net, а не обновления версии после приложения пул, перезагрузка служб и компьютеров, создание нового контейнера сайта, удаление и повторная загрузка всех файлов сайта и т. д.
Хотя я должен признать, что я не прочитал вашу проблему полностью, я хотел бы предположить, в чем может быть проблема. Я попытался опубликовать это как комментарий, но по какой-то причине сайт не разрешил.
Проблема может быть не в самой Subsonic DLL, а в другой DLL, на которую она ссылается. Версия A Subsonic.dll может вообще не ссылаться на эту другую DLL, но версия B может ссылаться на нее, и поэтому вы получаете другое поведение и не можете найти проблему.
Вам нужно использовать несколько хороших инструментов отладки, чтобы проходить через поток событий по одному, пока вы не найдете что-то, что выглядит неправильно.
Я также думаю, что этот вопрос больше подходит для StackOverflow. Я считаю, что это проблема, связанная с программированием, особенно в отношении ссылок на сборку.
Попробуйте также опубликовать сообщение на StackOverflow, вы заставите людей взглянуть на эту проблему под другим углом, чем ваши обычные администраторы сервера.
Пара вопросов:
Обновить: Попробуйте удалить содержимое:
%SystemRoot%\Microsoft.NET\Framework<64>\<versionNumber>\Temporary ASP.NET Files
Сделайте это для соответствующего пути (в зависимости от вашей версии .net и 32/64 бит).
Перед обновлением: Я не знаком с дозвуковой. Но, возможно, он генерирует сборку или хранимые процедуры. И почему-то старая версия этой штуки сохраняется даже после обновления dll. Использовать монитор процесса чтобы проверить, что приложение загружает с диска. И проверьте также хранимые процедуры, если это актуально.
Попробуйте следующее:
Измените учетную запись удостоверения пула приложений на admin.
Проверьте, не является ли Windows Server 2008 R2 отладочной версией.
Ознакомьтесь с этой ссылкой - IIS7 кэширует данные довольно долго, поэтому вы можете захотеть восстановить кеш.
http://blogs.iis.net/ksingla/archive/2006/11/16/caching-in-iis7.aspx
Я нашел проблему.
Поскольку я проводил дополнительные испытания на различных машинах, я наконец смог воспроизвести ошибку.
Код сайта + SubSonic 2.1.0 = ошибка
Код сайта + SubSonic 2.2.0 + SQL Server 2008 = работает
Код сайта + SubSonic 2.2.0 + SQL Server 2008 SP1 = ошибка
Бывает, что в 2.1.0 ошибка возникает несмотря ни на что, в 2.2.0 проблема исправлена. Существует дополнительная логическая ошибка: если вы используете 2008 SP1, возникает новая ошибка, но ее симптомы соответствуют исходной проблеме, которая была у меня в 2.1.0.
Заметив разницу в версиях базы данных SQL и подтвердив обновление моего окна разработки, а затем возникла ошибка, я смог найти некоторую дополнительную информацию теперь, когда я знал, что смотрю на новую проблему.
http://github.com/subsonic/SubSonic-2.0/issues
В частности, проблема 7, но 2, 8 и 9 кажутся тесно связанными и, вероятно, будут представлены с одним и тем же искаженным синтаксисом SQL.