在自托管网络中使用时出现城堡温莎异常 api
castle windsor exception when using in selfhosted web api
我在自托管 Web Api(使用 OwinSelfHost)中使用 Castle Windsor,但是当我调用控制器的 Get 方法时(它只是 return 一个字符串),我面临GetService WindsorDependencyScope class 方法中的以下异常(实现 IDependencyScope ):
看起来你忘了注册 http 模块 Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleModule
要修复此添加
转到关于您的 web.config 的部分。
如果你计划运行在集成管道模式下的IIS上,你还需要将模块添加到下的部分。
或者确保您的 GAC 中有 Microsoft.Web.Infrastructure、Version=1.0.0.0、Culture=neutral、PublicKeyToken=31bf3856ad364e35 程序集(它由 ASP.NET MVC3 或 WebMatrix 安装)并且 Windsor 将能够注册无需向配置文件添加任何内容即可自动模块。
有什么解决办法吗?
我能找到问题所在。在 ControllerInstaller class 中,使用了导致问题的 LifestylePerWebRequest 生活方式。我不知道确切的技术原因,但是在 "Web Api 2 + self hosted with Owin " 的组合中使用温莎城堡时,我们应该使用 LifestyleScoped 而不是 LifestylePerWebRequest 。这是安装程序代码(正确的代码):
public class ControllerInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Classes.FromThisAssembly()
.Pick().If(t => t.Name.EndsWith("Controller"))
.Configure(configurer => configurer.Named(configurer.Implementation.Name))
//.LifestylePerWebRequest() //---this caused the bug
.LifestyleScoped() //the correct one
);
}
}
我在自托管 Web Api(使用 OwinSelfHost)中使用 Castle Windsor,但是当我调用控制器的 Get 方法时(它只是 return 一个字符串),我面临GetService WindsorDependencyScope class 方法中的以下异常(实现 IDependencyScope ):
看起来你忘了注册 http 模块 Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleModule 要修复此添加 转到关于您的 web.config 的部分。 如果你计划运行在集成管道模式下的IIS上,你还需要将模块添加到下的部分。 或者确保您的 GAC 中有 Microsoft.Web.Infrastructure、Version=1.0.0.0、Culture=neutral、PublicKeyToken=31bf3856ad364e35 程序集(它由 ASP.NET MVC3 或 WebMatrix 安装)并且 Windsor 将能够注册无需向配置文件添加任何内容即可自动模块。
有什么解决办法吗?
我能找到问题所在。在 ControllerInstaller class 中,使用了导致问题的 LifestylePerWebRequest 生活方式。我不知道确切的技术原因,但是在 "Web Api 2 + self hosted with Owin " 的组合中使用温莎城堡时,我们应该使用 LifestyleScoped 而不是 LifestylePerWebRequest 。这是安装程序代码(正确的代码):
public class ControllerInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Classes.FromThisAssembly()
.Pick().If(t => t.Name.EndsWith("Controller"))
.Configure(configurer => configurer.Named(configurer.Implementation.Name))
//.LifestylePerWebRequest() //---this caused the bug
.LifestyleScoped() //the correct one
);
}
}