Asp.net 在ninject存储库中使用simplemembership-通过API&;标准控制器

Asp.net 在ninject存储库中使用simplemembership-通过API&;标准控制器,asp.net,asp.net-mvc-4,asp.net-web-api,Asp.net,Asp.net Mvc 4,Asp.net Web Api,我正在构建一个相当小的mvc4应用程序。我想使用我能及时提供的简单会员资格,因为它对社交活动有用 我希望在构建ios应用程序时能够利用项目中的webapi,并希望它能够使用相同的注册/帐户详细信息。我已经在网站上添加了一个API区域 我正在使用ninject进行注入,因此我创建了一个存储库,并使用了默认的成员注册组件并将其放入其中 我的帐户控制器和apicontroller使用相同的存储库 public RegisterModel RegisterLocalUser(RegisterModel

我正在构建一个相当小的mvc4应用程序。我想使用我能及时提供的简单会员资格,因为它对社交活动有用

我希望在构建ios应用程序时能够利用项目中的webapi,并希望它能够使用相同的注册/帐户详细信息。我已经在网站上添加了一个API区域

我正在使用ninject进行注入,因此我创建了一个存储库,并使用了默认的成员注册组件并将其放入其中

我的帐户控制器和apicontroller使用相同的存储库

 public RegisterModel RegisterLocalUser(RegisterModel model)
    {
        try
        {



            WebSecurity.CreateUserAndAccount(model.UserName, model.Password,
                                             new
                                             {
                                                 Mobile = model.Mobile,
                                                 FirstName = model.FirstName,
                                                 LastName = model.LastName,
                                                 Email = model.Email,
                                             });
使用该站点创建用户效果很好,但是当我试图通过fiddler使用api创建用户时,我遇到了一个问题

{“Message”:“出现错误。”,“ExceptionMessage”:“在调用\“WebSecurity\”类的任何其他方法之前,必须调用\“WebSecurity.InitializeDatabaseConnection\”方法。此调用应放在站点根目录下的_AppStart.cshtml文件中。”,“ExceptionType”:“System.InvalidOperationException”,“StackTrace”::“在WebMatrix.WebData.SimpleMembershipProvider.VerifyInitialized()\r\n在WebMatrix.WebData.WebSecurity.VerifyProvider()\r\n在WebMatrix.WebData.WebSecurity.CreateUserAndAccount(字符串用户名、字符串密码、对象属性值、布尔要求确认令牌)\r\n在MySite.Web.Repository.AccountRepository.RegisterLocalUserc:\@Projects\Site\Site\Site.Consumer.Web\Repository\AccountRepository.cs中的RegisterModel模型:c:\@Projects\Site\Site\Consumer.Web\areals\API\Controllers\AccountController.cs中的第28行\r\n在MySite.Web.areals.API.Controllers.accountcontrollers中的第26行\r\n在lambda\u方法(闭包、对象、对象[])\r\n位于System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.c_DisplayClass13.b_c(对象实例,对象[]方法参数)\r\n位于System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(对象实例,对象[]参数)\r\n在System.Web.Http.Controllers.ReflectedHttpActionDescriptor.c_DisplayClass5.b_4()\r\n在System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func`1 Func,CancellationToken CancellationToken)}

在存储库中添加断点CreateUserAndAccount永远不会完成

我有一个定制的DependancyResolver,需要它来让api和mvc工作

public class NinjectDependencyScope : IDependencyScope
{
private IResolutionRoot resolver;

internal NinjectDependencyScope(IResolutionRoot resolver)
{
    Contract.Assert(resolver != null);

    this.resolver = resolver;
}

public void Dispose()
{
    IDisposable disposable = resolver as IDisposable;
    if (disposable != null)
        disposable.Dispose();

    resolver = null;
}

public object GetService(Type serviceType)
{
    if (resolver == null)
        throw new ObjectDisposedException("this", "This scope has already been disposed");

    return resolver.TryGet(serviceType);
}

public IEnumerable<object> GetServices(Type serviceType)
{
    if (resolver == null)
        throw new ObjectDisposedException("this", "This scope has already been disposed");

    return resolver.GetAll(serviceType);
}
}

public class NinjectDependencyResolver : NinjectDependencyScope, IDependencyResolver
{
private IKernel kernel;

public NinjectDependencyResolver(IKernel kernel)
    : base(kernel)
{
    this.kernel = kernel;
}

public IDependencyScope BeginScope()
{
    return new NinjectDependencyScope(kernel.BeginBlock());
}
}
public类NinjectDependencyScope:IDependencyScope
{
专用IResolutionRoot解析器;
内部NinjectDependencyScope(IResolutionRoot解析器)
{
Assert(解析器!=null);
this.resolver=解析器;
}
公共空间处置()
{
IDisposable disposable=解析程序为IDisposable;
if(一次性!=null)
一次性的,一次性的;
解析器=空;
}
公共对象GetService(类型serviceType)
{
if(解析器==null)
抛出新的ObjectDisposedException(“此”、“此范围已被处置”);
返回解析器.TryGet(服务类型);
}
公共IEnumerable GetServices(类型serviceType)
{
if(解析器==null)
抛出新的ObjectDisposedException(“此”、“此范围已被处置”);
返回解析器.GetAll(serviceType);
}
}
公共类NinjectDependencyResolver:NinjectDependencyScope,IDependencyResolver
{
私有IKernel内核;
公共NinjectDependencyResolver(IKernel内核)
:基本(内核)
{
this.kernel=内核;
}
公共IDependencyScope BeginScope()
{
返回新的NinjectDependencyScope(kernel.BeginBlock());
}
}
是否有其他人能够找到一个解决方案来让这些组件协同工作


谢谢

您的错误转储表明您没有将
InitializeSimpleMembership属性
用于您的
AccountController

使用
InitializeSimpleMembershipAttribute
装饰您的新帐户控制器,或者将
Websecurity.InitializeDatabaseConnection()
移动到您的Global.asax启动代码中

当然,这忽略了依赖性问题,对此我没有一个好的答案,因为我不想费心注入Web安全性

  • WebSecurity是一个静态类
  • 您只需要在启动时调用InitializeDatabaseConnection一次。使用属性用法,每次访问控制器时都会调用它
  • 这意味着您必须将初始化的Web安全性注入到存储库中

  • 您的默认
    AccountController
    是否用
    InitializeSimpleMembershipAttribute
    修饰?谢谢Jasen!!!!这是一个非常简单的解决方案。将此添加为答案,如果您愿意,我将接受。谢谢