У нас есть существующее приложение, созданное на основе ASP.NET MVC 4 и веб-API. Административные части сайта используют простое членство. Я заинтересован в обновлении приложения до MVC 5/Web API 2, чтобы воспользоваться некоторыми новыми добавленными функциями. Но похоже, что они могут быть несовместимы.
В частности, после установки пакетов RC из NuGet в один из проектов моего решения и обновление информации web.config, приложение начинает умирать во время запуска на линии, которая вызывает WebSecurity.InitializeDatabaseConnection()
, за этим исключением:
[MethodAccessException: Attempt by security transparent method 'WebMatrix.WebData.PreApplicationStartCode.OnConnectionOpened(System.Object, WebMatrix.Data.ConnectionEventArgs)' to access security critical method 'System.Web.WebPages.HttpContextExtensions.RegisterForDispose(System.Web.HttpContextBase, System.IDisposable)' failed.]
WebMatrix.WebData.PreApplicationStartCode.OnConnectionOpened(Object sender, ConnectionEventArgs e) +70
WebMatrix.Data.Database.OnConnectionOpened() +70
WebMatrix.Data.Database.EnsureConnectionOpen() +51
WebMatrix.Data.Database.QueryValue(String commandText, Object[] args) +63
WebMatrix.WebData.DatabaseWrapper.QueryValue(String commandText, Object[] parameters) +13
WebMatrix.WebData.SimpleMembershipProvider.GetUserId(IDatabase db, String userTableName, String userNameColumn, String userIdColumn, String userName) +206
WebMatrix.WebData.SimpleMembershipProvider.ValidateUserTable() +87
Другие проекты в том же решении, использующие Simple Membership, которые я не обновил, продолжают нормально работать.
Погуглив дополнительную информацию, вы, конечно, обнаружите множество совпадений для этого исключения, но ничего особенного для WebMatrix.
FWIW: я знаю, что Microsoft представила (еще одно) решение для членства и идентификации, но если нет способа использовать его с существующими таблицами Simple Membership или плавного пути миграции для всех наши существующие пользовательские данные, это не вариант для нас.
ОБНОВЛЕНИЕ (11 октября)
Я только что попробовал это снова с новой проверкой текущего ствола нашего приложения. Я использую Visual Studio 2012, но в остальном следовал инструкциям MS по обновлению существующего проекта. После обновления до MVC 5/Web API 2/EF 6 приложение запустилось и работало нормально.
В web.config
для удаления не было явных требований доверия. Я добавил код из этого вопроса в Global.asax.cs
, и он сообщает, что приложение работает с полным доверием (в IIS Express просто нажмите F5 из VS).
Повторно добавляя тот же вызов к InitializeDatabaseConnection()
, он начинает умирать с точно таким же исключением.
РЕШЕНИЕ (28 октября)
Попробовав решение в пятничном обновлении @Kevin, я обнаружил, что оно работает. Мне было очень странно, что добавление этого явно не связанного пакета решит эти проблемы безопасности, и даже еще больше странно после того, как я удалил пакет из своего решения, и он продолжил работать.
Присмотревшись к происходящему, я понял, что причина, по которой это исправляет поведение, довольно проста: пакет Microsoft.AspNet.WebHelpers
имеет две зависимости, которые добавлялись в мое решение: Microsoft.AspNet.WebPages.Data
и Microsoft.AspNet.WebPages.WebData
. Microsoft переместила классы WebMatrix в новые пакеты.
Таким образом, добавленный пакет помощников устранил проблему не из-за того, что он что-то делал, а потому, что он вызывал добавление обновленных версий сломанных сборок в мое решение. Таким образом, решение первоначальной несовместимости заключается в установке этих новых пакетов при обновлении всего остального из NuGet:
Install-Package Microsoft.AspNet.WebPages.WebData
ОБНОВЛЕНИЕ (13 мая 2015 г.)
Мне было предложено, что вам также может потребоваться вручную установить второй новый пакет:
Install-Package Microsoft.AspNet.WebPages.Data
Это не должно быть необходимым, поскольку этот пакет явная зависимость от первого, и NuGet должен быть достаточно умен, чтобы установить оба. Но если вы получите ошибку при сборке или не видите, что NuGet добавляет зависимость, это может вам помочь.