Ответ 1
TL; DR:. В качестве обходного пути для этой проблемы найдите свой класс DbContext
, который наследует от IdentityDbContext<>
и изменит конструктор базового класса от base("DefaultConnection")
до base("DefaultConnection", false)
и сделайте полную перестройку в своем решении. Это отключит проверку на Entity 1.0.0, которая вызывает тайм-ауты при запуске из Publish Web.
Результаты отладки: После большой отладки мы обнаружили основную причину.
- Когда вы запускаете Publish Web с использованием кода-первого, используемого в вашем проекте, он захочет перечислить доступные строки подключения, чтобы обнаружить ваши базы данных.
- Чтобы сделать это, он назовет ваш класс
DbContext
, найдя его с отражением и вызовет его внутри процесса VisualStudio. - К сожалению, поскольку он выполняется в VisualStudio,
ConnectionManager
будет использоватьdevenv.exe.config
вместо вашегоweb.config
, поэтому вашweb.config
с его строками подключения игнорируется. - Как только вы назовете
IdentityDbContext<>
в формеbase("DefaultConnection")
, он вызволитbase("DefaultConnection", true)
, который (согласно второй параметр) попытается определить, использует ли ваша база данных схему Identity 1.0.0. - Чтобы сделать это, он попытается подключиться к вашей базе данных, идентифицированной именем соединения, переданного в
IdentityDbContext<>
(обычно это будет"DefaultConnection"
) - Так как
web.config
не загружен, строка подключения с таким именем будет недоступна. -
Для недоступной строки подключения Entity вызовет
DefaultConnectionFactory
. Опять же, вы не можете настроить его, так какweb.config
не загружается. По умолчаниюDefaultConnectionFactory
попытается подключиться к.\SQLEXPRESS
с помощьюInitial Catalog
= вашего имени соединения, что приведет к следующей строке подключения:Data Source=.\SQLEXPRESS;Initial Catalog=DefaultConnection;Integrated Security=True;MultipleActiveResultSets=True
-
Если у вас не установлен SQL Express, это приведет к исключению SQL, которое будет пытаться попытаться подключиться до истечения времени ожидания.
Таким образом, виновником является публикация Web, которая неправильно запускает сборку через отражение без загрузки соответствующего web.config
.
Рецепт отладки, с которым мы начали: Дайте понять, что происходит внутри.
- Сделайте несколько дампов во время замораживания (скажем, дамп каждые 2-3 секунды). Чтобы сделать дамп, я думаю, что самый простой способ: загрузить и запустить SysInternals Process Explorer и использовать
Context Menu on Visual Studio process | Create Dump | Create Minidump...
- Анализ дампов. Самый простой способ - использовать мгновенный анализ OSR
- Осмотрите стеки в дампах (начиная с
STACK_TEXT
в результатах анализа) - Имена функций в стеке уже могут сказать вам, что не так.
- Если это руководство вам не поможет, мне нужно будет увидеть свалки. Имейте в виду, что дампы будут содержать части памяти VS, которые могут содержать некоторую личную информацию, такую как пути к файлам.
Обновление
Теперь, когда анализ OSR не смог проанализировать стеки в дампах, кажется, нам придется сделать это с трудом.
Одноразовая подготовка
- Установите
Debugging Tools For Windows
как часть Windows SDK (очистите все остальные флажки, чтобы не устанавливать то, что вам не нужно) - Запустите
WinDBG (X86)
из установленного пакета -
В
File | Symbol File Path...
напишитеsrv*C:\Symbols*http://msdl.microsoft.com/download/symbols
-
Нажмите
File | Save workspace
Анализ дампа
- В WinDBG нажмите
File | Open crash dump...
и откройте дамп. - В поле редактирования внизу напишите
!analyze -v
и нажмите Enter. - Осмотрите стек.