2015-06-18 3 views
1

I a настроил мое приложение webApi так, что Entity Framework DBContent вводится с использованием RequestScope. Каждый репозиторий принимает DbContext как аргумент конструктора, который вводится с использованием Ninject.WebApi Ninject с InRequestScope с вызовом OPTIONS

Однако у меня возникли проблемы с запросами на предварительные рейсы (вызовы OPTIONS).

При получении вызова OPTIONS создаются соответствующие репозитории и используют один DbContext для каждого запроса, который будет отклонен, как ожидается, когда запрос вернется (200).

Соответствующие вызовы GET затем выполняются.

Что я вижу, так это то, что для этих вызовов не создается новый DbContext. Репозиторий пытается получить доступ к Контексту, который был удален в конце вызова OPTIONS.

Ожидается ли это? Я что-то упустил в своей конфигурации?

Вот некоторые Трассировочная

Вы можете видеть, что первая попытка использовать DB после запроса GET терпит неудачу как DbContext с ID 39bb041e-6098-4606-a4c0-aa5db2e8c6ed размещали в предыдущем вызове OPTIONS.

Process request: OPTIONS : http://localhost:52351/api/v1/aroute 
Process request: OPTIONS : http://localhost:52351/api/v1/broute 
Creating ctx 190d88ba-2781-4ba8-9b90-07d6af937fe9 at 18/06/2015 9:03:51 p.m. 
Create ARepository 
Creating ctx 39bb041e-6098-4606-a4c0-aa5db2e8c6ed at 18/06/2015 9:03:51 p.m. 
Create BRepository 
Create CRepository 
Process response: OK 
Process response: OK 
Disposing of 190d88ba-2781-4ba8-9b90-07d6af937fe9 at 18/06/2015 9:03:51 p.m. 
Disposing of 39bb041e-6098-4606-a4c0-aa5db2e8c6ed at 18/06/2015 9:03:51 p.m. 
Process request: GET : http://localhost:52351/api/v1/aroute 
Process request: GET : http://localhost:52351/api/v1/broute 
'iisexpress.exe' (CLR v4.0.30319: /LM/W3SVC/1839635423/ROOT-1-130790918249781429): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Numerics\v4.0_4.0.0.0__b77a5c561934e089\System.Numerics.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled. 
AccessDbMethod using 39bb041e-6098-4606-a4c0-aa5db2e8c6ed 
A first chance exception of type 'System.InvalidOperationException' occurred in EntityFramework.dll 

Репозиторное:

public ARepository(DbContext context) 
    { 
     _context = context; 
    } 

NinjectWebCommon:

public static void Start() 
    { 
     DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule)); 
     //tried with and without following line 
     DynamicModuleUtility.RegisterModule(typeof(Ninject.Web.Common.NinjectHttpModule)); 
     DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule)); 
     bootstrapper.Initialize(CreateKernel); 
    } 

    private static void RegisterServices(IKernel kernel) 
    { 
     //Ensure we only have ONE per request 
     kernel.Bind<DbContext>().ToSelf().InRequestScope(); 
    } 

Я установил следующие пакеты:

<package id="Microsoft.AspNet.Cors" version="5.2.2" targetFramework="net451" /> 
    <package id="Microsoft.AspNet.Mvc" version="5.2.2" targetFramework="net451" /> 
    <package id="Microsoft.AspNet.Razor" version="3.2.2" targetFramework="net451" /> 
    <package id="Microsoft.AspNet.Web.Optimization" version="1.1.3" targetFramework="net451" /> 
    <package id="Microsoft.AspNet.WebApi" version="5.2.2" targetFramework="net451" /> 
    <package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net451" /> 
    <package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net451" /> 
    <package id="Microsoft.AspNet.WebApi.Cors" version="5.2.2" targetFramework="net451" /> 
    <package id="Microsoft.AspNet.WebApi.HelpPage" version="5.2.2" targetFramework="net451" /> 
    <package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.2" targetFramework="net451" /> 
    <package id="Ninject" version="3.2.2.0" targetFramework="net451" /> 
    <package id="Ninject.Web.Common" version="3.2.3.0" targetFramework="net451" /> 
    <package id="Ninject.Web.Common.WebHost" version="3.2.3.0" targetFramework="net451" /> 
    <package id="Ninject.Web.WebApi" version="3.2.4.0" targetFramework="net451" /> 
    <package id="Ninject.Web.WebApi.WebHost" version="3.2.4.0" targetFramework="net451" /> 
+0

Ваши репозитории созданы в SingletonScope? Из журнала они, похоже, не создаются в запросе Get. Они должны быть созданы InRequestScope, например Context, для обеспечения непрерывного жизненного цикла для всей цепочки экземпляров. – jbl

+0

Да. Это была проблема. Я мог прийти к тому же самому выводу вчера вечером, когда я думал об этом в постели перед сном. Просто испытайте это сейчас. – Kildareflare

ответ

0

Раствор предварительно Я просто догадался об этом, размышляя над проблемой перед тем, как лечь спать. Я ранее изменил время жизни репозиториев на синглтон, чтобы проверить другую проблему.

Таким образом, хотя контекст имел объем запроса, хранилища, которые его потребляли, не были. Из-за наличия Singleton-сферы они никогда не удалялись и, следовательно, при следующем запросе пытались получить доступ к контексту, который больше не существовал.

Мораль: старайтесь не выполнять многозадачность, особенно не поздно ночью после полного рабочего дня.

1

У меня была такая же проблема некоторое время назад.

попробуйте использовать это так.

kernel.Bind<DbContext>().ToSelf().InScope(c => c.Request);