У нас есть существующее приложение, которое было создано на ASP.NET MVC 4 и веб-API. Административные части сайта используют Simple Membership. Я заинтересован в обновлении приложения до 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, которые я не обновил, продолжают работать нормально.
Google для получения дополнительной информации отображает множество хитов для этого исключения, конечно, но ничего особенного для 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-ed из 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 добавляет зависимость, это может вам помочь.