初始化筛选器类中的SimpleMembership时出现问题

本文关键字:问题 SimpleMembership 筛选 初始化 | 更新日期: 2023-09-27 18:24:12

我正在尝试初始化属性类,但由于某种原因,我很难得到结果。

我在visual studio 2012中创建了MVC4"Basic"项目模板。我在我的项目中创建了名为Filters的文件夹,并创建了类InitializeSimpleMembership.cs。我有主控制器和关联的视图,最后我在主控制器类中调用[InitializeSimpleMembership,但没有结果。应用程序未生成所需的表。(注意:我以前创建过数据库)

我正在尝试用最少的代码初始化SimpleMemberShip,这样我就可以理解它,并使它随着它的增长而变得复杂。

在Filter文件夹中

using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Threading;
using System.Web.Mvc;
using WebMatrix.WebData;
using SimpleLogin_System_04.Models;
namespace SimpleLogin_System_04.Filters
 {
  public class InitializeSimpleMembership : ActionFilterAttribute
  {
    private class SimpleMembershipInitializer
    {
        public SimpleMembershipInitializer()
        { 
          try
            {                  
              WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
            }
            catch (Exception ex)
            {
               throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, ex);
            }
        }
    }
  }
}

家庭控制器

namespace SimpleLogin_System_04.Controllers
 {
[InitializeSimpleMembership]
public class HomeController : Controller
{    
    public ActionResult Index()
    {
        return View();
    }
}
}

Web.config;连接字符串

<connectionStrings>
  <add name="DefaultConnection" providerName="System.Data.SqlClient" connectionString="Data Source=(LocalDb)'v11.0;Initial Catalog=dd3;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|'dd3.mdf" />
</connectionStrings>

初始化筛选器类中的SimpleMembership时出现问题

我没有看到任何调用SimpleMembershipInitializer构造函数的内容,该构造函数包含初始化数据库的代码。为什么不将该代码放在InitializeSimpleMembership的默认构造函数中呢。

我建议您只将初始化放在Global.asaxApplication_Start方法中,而不是使用筛选器类,因为您将其放在HomeController中。MVC 4 Internet模板在AccountController上使用筛选器的原因是,只有在使用安全性时,才考虑延迟加载安全性。如果您总是想初始化它,只需使用Global.asax即可。本文对SimpleMembership的初始化有很好的描述。

是的,我已经意识到我没有调用构造函数。我想继续使用过滤器名称空间,因为最终我会添加延迟加载。只是暂时尝试将事情分解为最小的部分,以便我能够理解安全行为。

另外,我也错过了一些实现。。。但现在系统运行了!我有办法解决这个问题。

过滤器文件夹

using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Threading;
using System.Web.Mvc;
using WebMatrix.WebData;
using SimpleLogin_System_04.Models;
namespace SimpleLogin_System_04.Filters
{
public class InitializeSimpleMembership : ActionFilterAttribute
{
    public InitializeSimpleMembership()
    {
        try
        {
            if (!WebSecurity.Initialized)
            {
                WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
            }
        }
        catch (Exception ex)
        {
            throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex);
        }
    }
}

}

webconfig

<connectionStrings>
  <add name="DefaultConnection" providerName="System.Data.SqlClient" connectionString="Data Source=(LocalDb)'v11.0;Initial Catalog=DB4;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|'DB4.mdf" />
</connectionStrings>
<membership defaultProvider="DefaultMembershipProvider">
  <providers>
    <add name="DefaultMembershipProvider" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData"/>
  </providers>
</membership>
<roleManager enabled="true">
  <providers>
    <add name="DefaultRoleProvider" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData"/>
  </providers>
</roleManager>

帐户控制器类

[Authorize]
[InitializeSimpleMembership]
public class AccountController : Controller

以及我在代码运行之前创建的数据库,因为如果找不到,我不希望系统创建一个。尽管它是在简单成员数据库连接初始化阶段创建表。。