在OWIN中使用带有Web Api Self Hosted的Simple Injector时,为什么会出现此ActivationException?

时间:2014-10-30 12:21:05

标签: asp.net-web-api owin asp.net-web-api2 self-hosting simple-injector

我有一个非常简单的Web Api v2.2自我托管在OWIN

public class StartUp
{
    public void Configuration(IAppBuilder appBuilder, IConfigReader configReader)
    {
        var container = new Container();

        container.Register<IConfigReader, ConfigReader>();

        var config = new HttpConfiguration();
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
        config.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container);
        appBuilder.UseWebApi(config);
    }
}

当我在我的Main()上使用时:

WebApp.Start(baseAddress, appBuilder => 
                new StartUp().Configuration(appBuilder, new ConfigReader()));

但是当我尝试执行最后一行appBuilder.UseWebApi(config);时,我得到以下异常:

  

“SimpleInjector.ActivationException”类型的第一次机会异常   发生在SimpleInjector.dll

中      

附加信息:给定类型IHostBufferPolicySelector是   不是具体的类型。请使用其他重载之一进行注册   这种类型。

完整筹码:

  

发生了SimpleInjector.ActivationException _HResult = -2146233088
  _message =给定类型IHostBufferPolicySelector不是具体类型。请使用其他一个重载来注册此类型   HResult = -2146233088 IsTransient = false Message =给定的类型   IHostBufferPolicySelector不是具体类型。请使用其中一个   注册此类型的其他重载。来源= SimpleInjector
  堆栈跟踪:          在SimpleInjector.Advanced.DefaultConstructorResolutionBehavior.VerifyTypeIsConcrete(Type   implementationType)InnerException:

问题不在于单个界面看起来SimpleInjector正在尝试为每个单一界面找到绑定;如果我为IHostBufferPolicySelector提供虚拟实现,它会抛出其他一些接口,例如IExceptionHandler等。

有相关主题HERE,但我不确定它与SimpleInjector的关系? Self主机是一个Console App,它安装了以下软件包:

  • 简单注入器ASP.NET Web API集成v2.61
  • 简单的注入执行上下文范围v2.61
  • Simple Injector v2.61
  • OWIN v1.0
  • Microsoft.Owin v2.0.2
  • Microsoft.Owin.Hosting v2.0.2
  • Microsoft ASP.NET Web API 2.2 OWIN v5.2.2
  • Microsoft ASP.NET Web API 2.2 OWIN Self Host v5.2.2

2 个答案:

答案 0 :(得分:4)

简单注射器:

  

您展示的例外情况是“第一次机会异常”。这些   Simple Injector会抛出异常,但它们会被捕获   由Simple Injector处理,他们不会冒泡调用堆栈。   您可能在某些调试器输出窗口中看到它们,但是   他们很正常,没什么可担心的。

答案 1 :(得分:1)

事实证明,当Common Language Runtime Exceptions检查到thrown

时,异常只会冒泡

当我取消勾选复选框时,一切都正常!这很奇怪!将它包裹在Try-Catch (Exception)中甚至不会抓住它,这使它更有趣/更有意思!