Asp.net mvc 4 你必须打电话;WebSecurity.InitializeDatabaseConnection“。。。但我已经有了

Asp.net mvc 4 你必须打电话;WebSecurity.InitializeDatabaseConnection“。。。但我已经有了,asp.net-mvc-4,asp.net-web-api,simplemembership,webmatrix-2,Asp.net Mvc 4,Asp.net Web Api,Simplemembership,Webmatrix 2,我已经通读了很多关于这个话题的问题,但似乎都是关于你应该把这个电话放在哪里 我的问题不同:我已经完成了WebSecurity.InitializeDatabaseConnection()调用,并设置了断点,因此我知道它已经执行了。但是我仍然得到无效操作异常说我必须调用它 与MVC控制器操作中遇到的大多数其他问题不同,我遇到的是一个HttpModule,我是为完成REST WebAPI控制器的身份验证而编写的。Init调用包含WebSecurity.InitializeDatabaseConnec

我已经通读了很多关于这个话题的问题,但似乎都是关于你应该把这个电话放在哪里

我的问题不同:我已经完成了
WebSecurity.InitializeDatabaseConnection()
调用,并设置了断点,因此我知道它已经执行了。但是我仍然得到
无效操作异常
说我必须调用它

与MVC控制器操作中遇到的大多数其他问题不同,我遇到的是一个
HttpModule
,我是为完成REST WebAPI控制器的身份验证而编写的。Init调用包含
WebSecurity.InitializeDatabaseConnection
调用。然后,
OnAuthenticationRequest
方法从请求的授权头中提取用户名和密码信息,并调用
SimpleMembershipProvider的
ValidateUser
方法。这就是我得到例外的地方

您必须调用
WebSecurity.InitializeDatabaseConnection
方法 在调用
WebSecurity
类的任何其他方法之前

所以

a)当我已经满足了不获得该异常的条件时,为什么我会获得该异常。

b) 对此可以做些什么?

您不需要每次调用HttpModule时都初始化数据库连接。只需在应用程序启动时执行一次。这是一个例子。还有一个指向示例项目源代码的链接。

在面对同一问题并设置了许多断点数小时后,我找到了适合我的环境的解决方案,我希望其他人能从中受益:

文件夹内应用程序启动

public class FilterConfig
{
  public static void RegisterGlobalFilters(GlobalFilterCollection filters)
  {
    var attr=new InitializeSimpleMembershipAttribute();
    // here is the important part
    attr.OnActionExecuting(new ActionExecutingContext());
    filters.Add(attr);
  }
}
背景:在我的应用程序中,我有两个视图:

  • /Account/Register:这是标准asp.mvc 4模板的一部分,具有属性[AllowAnonymous]
  • /任务:这是todo列表的“索引”视图,TaskController具有属性[Authorize(Roles=“Administrator”)]
我总是在以下情况下遇到问题:

  • 在浏览器中调试会话
  • 成功登录
  • 打开需要授权的视图“/任务”
  • 切换到visual studio并保持浏览器打开
  • 停止调试
  • 更改控制器内的一些代码(设置一些空格就足够了)
  • 启动调试会话
  • 在浏览器中按“刷新”
  • 此时,尚未调用类InitializeSimpleMembershipAttribute中的方法“OnActionExecuting”(通过设置断点确定)

    但是当我打开一个不需要授权的视图(即/Account/Register)时,调用了方法“OnActionExecuting”。在此之后,我可以毫无错误地调用/Task


    因此,解决方案是在应用程序启动时对“OnActionExecuting”进行“伪调用”。

    您可以发布异常的完整堆栈跟踪吗?我已经更改了代码,使其不再发生,但堆栈跟踪没有太多内容。问题是我试图创建自己的SimpleMembershipProvider实例,但该实例从未初始化。WebSecurity创建自己的实例,这就是它初始化的实例。我更改了代码,这样它就不用创建自己的实例,而只使用Membership.Provider返回的静态实例,错误就消失了。我仍然在HttpModule.Init()方法中调用InitializeDatabaseConnection。