我在这个问题上花了很多时间。但我最终得到了这个改变:
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:line 5
这恰好是我的 _Layout.cshtml 中的以下行:
if (User != null && User.Identity != null && (User.IsInRole("publisher") || User.IsInRole("admin")))
因此,为了测试我的简单解决方案,我在 EnsureInitialized 调用的 InitializeSmpleMembershipAttribute 类中放置了一个断点,在 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 中放置了一个断点(我将 User 的测试放在代码部分中,这样我就可以添加断点。
@{
var maintenanceAccess = false;
if (User != null && User.Identity != null && (User.IsInRole("publisher") || User.IsInRole("admin")))
{
maintenanceAccess = true;
}
}
放入断点后,我所做的是注释掉 filters.Add(new InitializSimpleMembershipAttribute() 然后在 Visual Studio 中启动应用程序。我可以看到我在任何其他断点之前命中了 _Layout.cshtml 中的断点。然后我取消注释该行并再次运行应用程序。这次我看到 InitializeSimpleMembershipAttribute 类中的断点发生在 _Layout.cshtml 中的断点之前。为了确保它正常工作,我登录了我的网站,然后看到InitializeSimpleMembershipAttribute 类(EnsureInitialized)中的第一个断点,但不是第二个断点 - 这是我所期望的。
所以这一切似乎都奏效了。
感谢所有发现这一点的人!