Ninject.Web.Common lançando ActivationException tentando injetar dependências em HttpApplicationInitializationHttpModule
-
13-12-2019 - |
Pergunta
Não sei por onde começar a resolver isso, mas estou recebendo uma exceção ao tentar executar meu aplicativo ASP.NET MVC.
Aqui está o erro que estou recebendo:
[Exceção de ativação:Erro ao ativar IntPtr
Nenhuma ligação correspondente está disponível e o tipo não é autovinculável.Caminho de ativação:
- Injeção da dependência IntPtr no método de parâmetro do construtor do tipo Func{IKernel}
- Injeção da dependência Func{IKernel} no parâmetro lazyKernel do construtor do tipo HttpApplicationInitializationHttpModule
- Solicitação de IHttpModule
Sugestões:
- Certifique-se de ter definido uma ligação para IntPtr.
- Se a ligação foi definida em um módulo, certifique-se de que o módulo tenha sido carregado no kernel.
- Certifique-se de não ter criado acidentalmente mais de um kernel.
- Se você estiver usando argumentos do construtor, certifique-se de que o nome do parâmetro corresponda ao nome do parâmetro do construtor.
- Se você estiver usando o carregamento automático de módulos, certifique-se de que o caminho de pesquisa e os filtros estejam corretos.
O rastreamento de pilha é o seguinte:
at Ninject.KernelBase.Resolve(IRequest request) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:line 359
at Ninject.Planning.Targets.Target`1.GetValue(Type service, IContext parent) in c:\Projects\Ninject\ninject\src\Ninject\Planning\Targets\Target.cs:line 197
at Ninject.Planning.Targets.Target`1.ResolveWithin(IContext parent) in c:\Projects\Ninject\ninject\src\Ninject\Planning\Targets\Target.cs:line 165
at Ninject.Activation.Providers.StandardProvider.GetValue(IContext context, ITarget target) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 114
at Ninject.Activation.Providers.StandardProvider.<>c__DisplayClass4.<Create>b__2(ITarget target) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 96
at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
at Ninject.Activation.Providers.StandardProvider.Create(IContext context) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 96
at Ninject.Activation.Context.Resolve() in c:\Projects\Ninject\ninject\src\Ninject\Activation\Context.cs:line 157
at Ninject.KernelBase.<>c__DisplayClass10.<Resolve>b__c(IBinding binding) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:line 386
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source)
at Ninject.Planning.Targets.Target`1.GetValue(Type service, IContext parent) in c:\Projects\Ninject\ninject\src\Ninject\Planning\Targets\Target.cs:line 197
at Ninject.Planning.Targets.Target`1.ResolveWithin(IContext parent) in c:\Projects\Ninject\ninject\src\Ninject\Planning\Targets\Target.cs:line 165
at Ninject.Activation.Providers.StandardProvider.GetValue(IContext context, ITarget target) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 114
at Ninject.Activation.Providers.StandardProvider.<>c__DisplayClass4.<Create>b__2(ITarget target) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 96
at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
at Ninject.Activation.Providers.StandardProvider.Create(IContext context) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 96
at Ninject.Activation.Context.Resolve() in c:\Projects\Ninject\ninject\src\Ninject\Activation\Context.cs:line 157
at Ninject.KernelBase.<>c__DisplayClass10.<Resolve>b__c(IBinding binding) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:line 386
at System.Linq.Enumerable.WhereSelectListIterator`2.MoveNext()
at System.Linq.Enumerable.<CastIterator>d__b1`1.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at Ninject.Web.Common.NinjectHttpModule.Init(HttpApplication context) in c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\NinjectHttpModule.cs:line 41
at System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers)
at System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context)
at System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context)
at System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext)
Isso não parece ser um erro que todo mundo está recebendo (pelo menos, minhas pesquisas no Google não revelaram nada de útil), então presumo que estou fazendo algo estranho, mas não tenho ideia de por onde começar a depurar isso.
Devo mencionar que estou usando várias bibliotecas Ninject (Ninject, Ninject.Web.Common, Ninject.MVC3 e Ninject.FluentValidation), todas da versão 3.0.00-RC3.Sei que todas as apostas serão canceladas se eu usar bibliotecas de pré-lançamento, mas tenho a sensação de que estou fazendo algo errado porque outros não parecem estar recebendo o mesmo erro.
Alguma ideia sobre qual poderia ser o problema ou onde devo começar a procurar?
Solução 2
Decidi excluir meu arquivo App_Start injectWebCommon.cs (que foi criado quando instalei o Ninject.MVC 3.0.0-rc2) e reinstalar o pacote Nuget (rc3).O arquivo NinjectWebCommon.cs recém-criado era um pouco diferente.Problema resolvido!
Outras dicas
Você pode corrigir isso adicionando estas duas ligações ao kernel:
kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
Enfrentei o mesmo problema com um projeto WebApi, depurando notei que o CreateKernel em App_Start/NinjectWebCommon.cs foi chamado duas vezes, e na segunda vez que travou, corrigi a remoção de 2 linhas no topo desse arquivo
[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(RetailStore.App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivatorEx.ApplicationShutdownMethodAttribute(typeof(RetailStore.App_Start.NinjectWebCommon), "Stop")]
E então o método foi chamado uma vez e o bug desapareceu.
Recebi exatamente a mesma mensagem de erro, embora o código não tenha mudado desde a noite anterior.Eu estava trabalhando no código de exemplo de http://www.asp.net/web-api/videos/getting-started/authorization
Perdi bem mais de uma hora por causa de algo bobo.Eu havia decorado meu controlador para [Autorizar], mas no dia seguinte, quando comecei a trabalhar e estava testando a API, minha sessão não era mais válida, então presumi que havia algo sutil no código que havia mudado.
Espero que isso ajude alguém que é tão novo no Ninject quanto eu...
O que apareceu no meu navegador foi:
XML Parsing Error: no element found
Location: server-name/api/Cities/
Line Number 1, Column 1: