かなり小さいサイズの 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());
}
}
これらのコンポーネントを連携させるための回避策を見つけた人はいますか?
ありがとうございました