Я потратил много часов на эту самую проблему. но я закончил только с этим изменением:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new InitializeSimpleMembershipAttribute());
}
}
Я случайно видел следующую ошибку
System.Web.HttpException (0x80004005): невозможно подключиться к базе данных SQL Server. ---> System.Data.SqlClient.SqlException (0x80131904): ошибка, связанная с сетью или экземпляром, при установлении соединения с SQL Server. Сервер не найден или не был доступен. Убедитесь, что имя экземпляра указано правильно и что SQL Server настроен на разрешение удаленных подключений. (поставщик: Сетевые интерфейсы SQL, ошибка: 26 — Ошибка при обнаружении указанного сервера/экземпляра)
Я заметил, что всякий раз, когда я вижу ошибку, я также вижу:
в ASP._Page_Views_Shared__Layout_cshtml.Execute() в h:\root\home\btournoux-001\www\site7\Views\Shared_Layout.cshtml:строка 5
Это следующая строка в моем _Layout.cshtml:
if (User != null && User.Identity != null && (User.IsInRole("publisher") || User.IsInRole("admin")))
Итак, чтобы протестировать мое простое решение, я поставил точку останова в своем классе InitializeSmpleMembershipAttribute на вызове SureInitialized и еще одну на первую строку в SimpleMembershipInitializer.
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
// Ensure ASP.NET Simple Membership is initialized only once per app start
LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock);
}
private class SimpleMembershipInitializer
{
public SimpleMembershipInitializer()
{
Database.SetInitializer<DataContext>(null);
В дополнение к этим двум точкам останова я также поставил точку останова в своем _Layout.cshtml (я поместил тест для пользователя в раздел кода, чтобы добавить точку останова.
@{
var maintenanceAccess = false;
if (User != null && User.Identity != null && (User.IsInRole("publisher") || User.IsInRole("admin")))
{
maintenanceAccess = true;
}
}
После установки точек останова я закомментировал фильтры. Добавить( new InitializSimpleMembershipAttribute() , а затем запустил приложение в Visual Studio. Я мог видеть, что я наткнулся на точку останова в _Layout.cshtml перед любой другой точкой останова. Затем Я раскомментировал эту строку и снова запустил приложение. На этот раз я увидел, что точки останова внутри класса InitializeSimpleMembershipAttribute возникают до точки останова в _Layout.cshtml. И чтобы убедиться, что все работает правильно, я вошел на свой веб-сайт, а затем увидел первая точка останова в классе InitializeSimpleMembershipAttribute (EnsureInitialized), но не вторая, чего я и ожидал.
Так вроде все работает.
Спасибо всем, кто это обнаружил!
person
N8NT
schedule
23.12.2013