Вероятно, это не MVC-специфичный, он может также применяться к ASP.NET WebForms, но мы уже сталкивались с этим на MVC2.
Когда мы начинаем удаленное развертывание с помощью MSDeploy, мы получаем краткую (5-6 секунд) страницу "ошибка сервера" для наших запросов до тех пор, пока не произойдет новое развертывание. Вот текст ошибки:
Ошибка сервера в приложении "/".
Не удалось загрузить файл или сборку "Some.Assembly" или один из его зависимостей. Процесс не может доступ к файлу, поскольку он используемый другим процессом. (Исключение от HRESULT: 0x80070020)
Описание: Необработанное исключение произошли во время выполнения текущий веб-запрос. Пожалуйста, просмотрите трассировки стека для получения дополнительной информации о ошибка и где она возникла в код.
Сведения об исключении: Исправление System.IO.FileLoadException: не удалось загрузить файл или сборку "Some.Assembly" или одной из его зависимостей. процесс не может получить доступ к файлу, потому что он используется другим процессом. (Исключение из HRESULT: 0x80070020)
Информация о версии: Microsoft.NET Версия Framework: 4.0.30319; ASP.NET Версия: 4.0.30319.1
Вот трассировки стека, показанные на странице ошибок:
[FileLoadException: Could not load file or assembly 'Some.Assembly' or one of its dependencies. The process cannot access the file because it is being used by another process. (Exception from HRESULT: 0x80070020)]
System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +0
System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +39
System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection, Boolean suppressSecurityChecks) +132
System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) +144
System.Reflection.Assembly.Load(String assemblyString) +28
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +46
[ConfigurationErrorsException: Could not load file or assembly 'Some.Assembly' or one of its dependencies. The process cannot access the file because it is being used by another process. (Exception from HRESULT: 0x80070020)]
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +618
System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory() +209
System.Web.Configuration.CompilationSection.LoadAssembly(AssemblyInfo ai) +130
System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig) +178
System.Web.Compilation.BuildManager.GetPreStartInitMethodsFromReferencedAssemblies() +94
System.Web.Compilation.BuildManager.CallPreStartInitMethods() +332
System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException) +591
[HttpException (0x80004005): Could not load file or assembly 'Some.Assembly' or one of its dependencies. The process cannot access the file because it is being used by another process. (Exception from HRESULT: 0x80070020)]
System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +8950644
System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +97
System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +256
Сборка, которая вызывает этот сбой (Some.Assembly), не является фактической веб-сборкой, а одним из других компонентов под ней "Ссылки", подписанным с .snk.
Через 5-6 секунд сайт идет вверх и ошибка исчезает.
Это, конечно, не желаемое поведение. Интересно, делаем ли мы что-то неправильно с точки зрения подключения компонентов вместе. Должен ли быть другой подход к обеспечению плавного развертывания? Или это может быть ошибка с самим MVC2?
P.S. Взаимодействие IIS с перекрытием включено, оно по умолчанию в любом случае.
Вот компоненты:
- A.dll
- Some.Assembly.dll(< --- это неудачный, зависит от A.dll)
- B.dll(зависит от A.dll и Some.Assembly.dll)
- Web.dll(это веб-приложение, зависит от всего вышеперечисленного)
Все зависимости устанавливаются с использованием регулярных ссылок на сборку с Copy Local
. Все dll являются частью решения в виде отдельных проектов.
MSDeploy только развертывает двоичные файлы, а не источник.