0

我正在构建一个相当小的 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,
                                             });

使用该站点创建用户工作正常但是当我尝试通过提琴手使用 api 来创建用户时,我遇到了一个问题

{"Message":"发生错误。","ExceptionMessage":"您必须在调用 \"WebSecurity\" 类的任何其他方法之前调用 \"WebSecurity.InitializeDatabaseConnection\" 方法。应该放置此调用在站点根目录的 _AppStart.cshtml 文件中。","ExceptionType":"System.InvalidOperationException","StackTrace":" at WebMatrix.WebData.SimpleMembershipProvider.VerifyInitialized()\r\n at WebMatrix.WebData.WebSecurity .VerifyProvider()\r\n at WebMatrix.WebData.WebSecurity.CreateUserAndAccount(String userName, String password, Object propertyValues, Boolean requireConfirmationToken)\r\n at MySite.Web.Repository.AccountRepository.RegisterLocalUser(RegisterModel model) in c: \@Projects\Site\Site\Site.Consumer。Web\Repository\AccountRepository.cs:第 28 行\r\n,位于 c:\@Projects\Site\Site\Site.Consumer.Web\Areas 中的 MySite.Web.Areas.API.Controllers.AccountController.RegisterLocal(RegisterModel 数据) \API\Controllers\AccountController.cs:第 26 行\r\n 在 lambda_method(Closure , Object , Object[] )\r\n 在 System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c_DisplayClass13.b _c(Object instance, Object[] methodParameters)\r\n at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)\r\n at System.Web.Http .Controllers.ReflectedHttpActionDescriptor.<>c_ DisplayClass5.b _4()\r\n at System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func`1 func, CancellationToken cancelToken)"}

在存储库中添加断点 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());
}
}

其他人是否能够找到解决方法来使这些组件协同工作?

谢谢

4

1 回答 1

0

您的错误转储表明您没有使用InitializeSimpleMembershipAttribute.AccountController

要么装饰您的新帐户控制器,InitializeSimpleMembershipAttribute要么将其Websecurity.InitializeDatabaseConnection()移至您的 Global.asax 启动代码。

当然,这忽略了依赖问题,我没有一个好的答案,因为我不打扰注入 WebSecurity。

  1. WebSecurity 是一个静态类
  2. 您只需要在启动时调用 InitializeDatabaseConnection 一次。使用属性用法,每次访问控制器时都会调用它。
  3. 这意味着您必须将初始化的 WebSecurity 注入您的存储库。
于 2013-06-10T23:47:44.560 回答