Расширения Ninject OWIN нарушают CreatePerOwinContext для веб-API

При попытке использовать Ninject с новым проектом Web API 2, использующим ASP.NET Identity, я столкнулся с некоторым странным поведением. Я не могу передать обратные вызовы в CreatePerOwinContext() для запуска запросов к контроллерам веб-API. Для контроллеров MVC они работают нормально.

Шаги для воссоздания:

  1. Файл -> Новое веб-приложение ASP.NET VS 2013
  2. Проверьте MVC и WebAPI
  3. В разделе «Аутентификация» выберите «Индивидуальный».
  4. Добавьте пакеты nuget для Ninject, Ninject.Web.Common.OwinHost, Ninject.Web.WebApi.OwinHost и зависимых пакетов.
  5. Следуйте руководству по настройке ninject. для вашего приложения с поддержкой Owin
  6. Поместите точку останова в свой ApplicationUserManager.Create(), а затем отладьте F5
  7. Обратите внимание, что запрос к вашему домашнему контроллеру работает нормально — точка останова сработала. Сделайте запрос скрипача к контроллеру API - скажем, api/Account/Register, и обратный вызов просто никогда не вызывается

Я не поклонник ninject, поэтому я не уверен, что я делаю неправильно или это ошибка в расширениях Ninject OWIN. Я склоняюсь к тому, чтобы оставить OwinContext позади и просто использовать область видимости Ninject perHttpRequest, но я не уверен, что система идентификации ASP.NET сломается. Я слышал, что могут быть внутренние вызовы OwinContext.Get(), которые сломаются, если я не буду хранить вещи в контексте OWIN.

Очень ценю чьи-либо мысли.


person JasonCoder    schedule 10.10.2014    source источник


Ответы (1)


В итоге я обошел это, используя Ninject для управления всей жизнью. Очевидно, что .CreatePerOwinContext() — это решение для устранения пробелов, которое вам не нужно при использовании полнофункционального инструмент ДИ.

Единственное, о чем я знаю, это то, что для аутентификации на основе файлов cookie ASP.NET Identity будет искать в OwinContext свой UserManager. Я использую аутентификацию на основе токенов, но я видел, как некоторые люди идут дальше и помещают UserManager в OwinContext.

Мои привязки Ninject:

private static readonly Lazy<IKernel> _lazyKernel = new Lazy<IKernel>(CreateKernel);

    // Access the singleton kernel via this property
    public static IKernel Kernel { get { return _lazyKernel.Value; } }

private void ConfigureNinject(IAppBuilder app)
{
    app.UseNinjectMiddleware(() => Kernel);
    Kernel.Bind<IAppBuilder>().ToConstant(app);
}

private static void RegisterServices(IKernel kernel)
{
    kernel.Bind<AuthDbContext>().ToSelf().InRequestScope().WithConstructorArgument("connectionString", "MyConnectionString");
    kernel.Bind<IUserStore<MyApplicationUser, int>>().To<MyUserStore>().InRequestScope();
    kernel.Bind<IRoleStore<MyRole, int>>().To<MyRoleStore>().InRequestScope();
    kernel.Bind<MyUserManager>().ToSelf().InRequestScope();
    kernel.Bind<ISecureDataFormat<AuthenticationTicket>>().To<SecureDataFormat<AuthenticationTicket>>();
    kernel.Bind<IDataSerializer<AuthenticationTicket>>().To<TicketSerializer>();
    kernel.Bind<IDataProtector>().ToMethod(x => x.Kernel.Get<IAppBuilder>().GetDataProtectionProvider().Create("ASP.NET Identity"));
    kernel.Bind<ITextEncoder>().To<Base64UrlTextEncoder>();
}
person JasonCoder    schedule 29.12.2014