Я получил InvalidOperationException
, когда контроллер MVC попытался выполнить FindView
при использовании PrecompiledMvcEngine
.
Использование на машине с VS2012, MVC4 и развернутой в IIS
Я получил InvalidOperationException
, когда контроллер MVC попытался выполнить FindView
при использовании PrecompiledMvcEngine
.
Использование на машине с VS2012, MVC4 и развернутой в IIS
После просмотра исходного кода от ControllerBase.FindView
до ViewEngineCollection.FindView
до VirtualPathProviderViewEngine в PrecompiledMvcEngine , обнаружил, что счетчик _mappings
в PrecompiledMvcEngine равен 0. (Передача в Reflection и с открытым исходным кодом.)
Причина в том, что в DLL моего проекта не было типа, назначаемого для WebPageRenderingBase. При декомпиляции моей dll у нее действительно были скомпилированные представления и представления, расширенные из WebPageRenderingBase.
После написания модульного теста, который делает то же самое, что PrecompiledMvcEngine делает для загрузки представлений, обнаружил, что они используют разные версии класса WebPageRenderingBase. RazorGenerator.Mvc использует System.Web.WebPages версии 1.0.0.0 для предварительной компиляции во время сборки. PrecompiledMvcEngine использует System.Web.WebPages версии 2.0.0.0 при загрузке типов из скомпилированной сборки. Исправлено это, изменив мой csproject MVC так, чтобы он также загружал v1.0.0.0 во время выполнения.
Измененный
<Reference Include="System.Web.WebPages" />
который поднял 2.0.0.0 до
<Reference Include="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
заставляя его всегда выбирать 1.0.0.0. Эта проблема часто возникает, если вы развертываете предварительно скомпилированные представления на машине с установленными VS2012 и MVC4, не указывая правильную версию в файле csproj.