0

かなり小さいサイズの mvc4 アプリケーションを構築しています。提供されている単純なメンバーシップを、ソーシャルなものに役立つように使用したいと考えています。

iOS アプリケーションを構築していて、同じ登録/アカウントの詳細を使用できるようにしたいので、プロジェクト内で webapi を利用できるようにしたいと考えています。サイトに API エリアを追加しました。

インジェクションにninjectを使用しているため、リポジトリを作成し、デフォルトのメンバーシップ登録コンポーネントを取得してこれに入れました。

My Account コントローラーと 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 を使用してユーザーを作成しようとすると、問題が発生します

{"メッセージ":"エラーが発生しました。","ExceptionMessage":"\"WebSecurity\" クラスの他のメソッドを呼び出す前に、\"WebSecurity.InitializeDatabaseConnection\" メソッドを呼び出す必要があります。この呼び出しは配置する必要があります。サイトのルートにある _AppStart.cshtml ファイル内。 .VerifyProvider()\r\n で WebMatrix.WebData.WebSecurity.CreateUserAndAccount(String userName, String password, Object propertyValues, Boolean requireConfirmationToken)\r\n MySite.Web.Repository.AccountRepository.RegisterLocalUser(RegisterModel モデル) で c: \@Projects\Site\Site\Site.Consumer.Web\Repository\AccountRepository.cs: c:\@Projects\Site\Site\Site.Consumer.Web\Areas の MySite.Web.Areas.API.Controllers.AccountController.RegisterLocal(RegisterModel データ) の行 28\r\n \API\Controllers\AccountController.cs: 26 行目 \r\n の lambda_method(Closure , Object , Object[] )\r\n at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c_DisplayClass13.b _c(オブジェクト インスタンス、Object[] methodParameters)\r\n で System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(オブジェクト インスタンス、Object[] 引数)\r\n で System.Web.Http .Controllers.ReflectedHttpActionDescriptor.<>c_ DisplayClass5.b _4 ()\r\n at System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func`1 func, CancellationToken cancelToken)"}

リポジトリ内にブレークポイントを追加すると、CreateUserAndAccount が完了しません。

API と MVC が機能するために必要なカスタム DependancyResolver があります。

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